C 實現tar包解析

2021-08-28 20:15:34 字數 4042 閱讀 1243

tar(tapearchive)是unix和類unix系統上檔案打包工具,可以將多個檔案合併為乙個檔案,使用tar工具打出來的包稱為tar包。一般打包後的檔名字尾為」.tar」,也可以為其它。tar代表未被壓縮的tar檔案,已被壓縮的tar檔案則追加壓縮檔案的副檔名,如經過gzip壓縮後的tar檔案,擴充套件名為」.tar.gz」。在windows系統中用winrar也可以解壓縮開啟tar包。tar檔案格式已經成為posix標準,最初是posix.1-1998,目前是posix.1-2001.

tar中的資料都是以512位元組為單位。tar由兩部分組成即頭部+內容,其中頭部是512位元組的頭部結構,內容是存放乙個檔案內容的地方。

tar檔案格式的詳細介紹可以參考:

通過執行以下命令生成測試tar包:

tar -cvf test.tar *
test.tar中包含兩個檔案blog_info.txt和github_info.txt.

其中blog_info.txt檔案內容如下:

name: fengbingchun

address:

github_info.txt檔案內容如下:

name: fengbingchun

address:

實現**tar.hpp:

#ifndef fbc_messy_test_tar_hpp_

#define fbc_messy_test_tar_hpp_

#include #include /* reference:

/* tar header block, from posix 1003.1-1990.  */

/* posix header.  */

typedef struct posix_header

tar_posix_header; /*

location  size  field

0         100   file name

100       8     file mode

108       8     owner's numeric user id

116       8     group's numeric user id

124       12    file size in bytes

136       12    last modification time in numeric unix time format

148       8     checksum for header block

156       1     link indicator (file type)

157       100   name of linked file*/ 

#define tmagic   "ustar"        /* ustar and a null */

#define tmaglen  6

#define tversion "00"           /* 00 and no null */

#define tverslen 2

/* values used in typeflag field.  */

#define regtype  '0'            /* regular file */

#define aregtype '\0'           /* regular file */

#define lnktype  '1'            /* link */

#define symtype  '2'            /* reserved */

#define chrtype  '3'            /* character special */

#define blktype  '4'            /* block special */

#define dirtype  '5'            /* directory */

#define fifotype '6'            /* fifo special */

#define conttype '7'            /* reserved */

class tarfile ;

int test_tar();

#endif // fbc_messy_test_tar_hpp_

tar.cpp:

#include "tar.hpp" 

tarfile::tarfile(const char* tar_name)

: file(nullptr), size(0)

tarfile::~tarfile()

file_names.clear();

file_sizes.clear();

file_data_start_addrs.clear();} 

bool tarfile::isvalidtarfile()

;    unsigned char buf[block_size];

tar_posix_header* header = (tar_posix_header*)buf;

memset(buf, 0, block_size);

fseek(file, 0, seek_end);

size = ftell(file);

fseek(file, 0, seek_set);

if (size % block_size != 0)

size_t pos;

while (1) ;

sscanf(header->size, "%lo", &file_size);

size_t file_block_count = (file_size + block_size - 1) / block_size;

switch (header->typeflag)

pos += file_block_count * block_size;

fseek(file, pos, seek_set);

}fseek(file, 0, seek_set);

return true;} 

std::vectortarfile::getfilenames()

bool tarfile::getfilecontents(const char* file_name, char* contents)

}return flag;} 

size_t tarfile::getfilesize(const char* file_name); 

for (int i = 0; i < file_names.size(); i++)

}return file_size;} 

size_t tarfile::gettarsize() //

int test_tar()

;    tarfile tarfile(tar_file_path.c_str());

bool is_valid_tar_file = tarfile.isvalidtarfile();

if (!is_valid_tar_file)

fprintf(stderr, "tar file size: %d byte\n", tarfile.gettarsize());

std::vectorfile_names = tarfile.getfilenames();

fprintf(stderr, "tar file count: %d\n", file_names.size());

for (auto name : file_names)

return 0;

}

測試結果如下:

解析tar命令

tar命令的用法如下。摘自 鳥哥的私房菜 tar zxcvfpp tfile sfile 引數說明 z 是否同時具有 gzip 的屬性?x 解開乙個壓縮檔案的引數指令!t 檢視 tarfile 裡面的檔案!c 建立乙個壓縮檔案的引數指令 v 壓縮的過程中顯示檔案!f 使用檔名,請留意,在 f 之後要...

c語言提取tar包內容

tar檔案 以一定方式將多個檔案合併成tar檔案,不對檔案進行壓縮,tar檔案格式 很 簡單,每個檔案前面 512位元組的header,並且將所有檔案疊放在一起 header1 file1 header2 file2 header3 file3 解包就是讀取檔案頭得到檔案大小,然後讀取出檔案就行了 ...

C C 解析tar檔案

3 tar檔案解包實現 4 參考文章 tar檔案是一種打包檔案 非壓縮檔案 在電腦上我們經常能看到的一種檔案,是將多個檔案打包成乙個檔案,以方便拷貝和傳輸。在嵌入式系統中,tar檔案也是使用較為廣泛。假設我們現在有乙個這樣的控制系統,乙個主控裝置管理器,下面通過乙太網 rs232 rs485連線著多...