7Z原始碼分析 7z h

2021-08-20 16:37:57 字數 2428 閱讀 3570

#define k7zstartheadersize 0x20

#define k7zsignaturesize 6

extern

const byte k7zsignature[k7zsignaturesize];

檔案的開頭處定義了2個巨集,k7zstartheadersize 是7z檔案頭的大小(詳情可見7z檔案格式及其原始碼的分析(三));k7zsignaturesize是7z檔案標誌的大小;k7zsignature是7z檔案標誌(是乙個常量,7zarcin.c中定義了const byte k7zsignature[k7zsignaturesize] = ;)。

typedef

struct

cszdata;

結構體cszdata的第乙個變數是乙個指向常量的指標(data指向位址的內容不可改變,但是data指向的位址是可以改變的),第二個變數是size_t型別的,表示data的大小。

/* cszcoderinfo & cszfolder support only default methods */

typedef struct

cszcoderinfo;

typedef struct

cszbond;

#define sz_num_coders_in_folder_max 4

#define sz_num_bonds_in_folder_max 3

#define sz_num_pack_streams_in_folder_max 4

typedef struct

cszfolder;

先介紹三個巨集的意義,sz_num_coders_in_folder_max表示支援的壓縮演算法種類的最大個數(從原始碼和7z軟體都可以看出,只支援lzma2、lzma、ppmd、bzip2四種壓縮);sz_num_bonds_in_folder_max表示繫結對的最大個數;sz_num_pack_streams_in_folder_max表示打包資料流的最大個數。

cszcoderinfo描述了乙個coder的資訊(coder的解釋見7z檔案格式及其原始碼的分析(四)),propsoffset是屬性的偏移,methodid是壓縮演算法id(id的定義見7zdec.c),numstreams資料流的個數,propssize是屬性大小。

cszbond描述了繫結對的資訊,inindex是輸入索引,outindex是輸出索引。

cszfolder描述了資料夾的資訊,numcoders是coder的個數,numbonds是繫結對的個數,numpackstreams是打包資料流的個數,unpackstream是解包流,packstreams存放的是打包流,bonds存放的是繫結對的資訊,coders存放的是coder的資訊。

typedef

struct

cntfsfiletime;

typedef

struct

cszbitui32s;

typedef

struct

cszbitui64s;

cntfsfiletime表示乙個64位的值(類似於結構體filetime的定義)。

cszbitui32s表示無符號32位數值。

cszbitui64s表示無符號64位數值。

typedef

struct

cszar;

typedef

struct

cszarex;

對於cszar和cszarex每個變數的意義,只能從變數名進行猜測(從作者的注釋可以看到有些變數應該存放的值),對於cszar和cszarex中ar是什麼的簡稱,我沒有猜測出來,從原始碼看,它們存放的應該是壓縮包的資訊。

#define szbitarray_check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)

#define szbitwithvals_check(p, i) ((p)->defs && ((p)->defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)

#define szarex_isdir(p, i) (szbitarray_check((p)->isdirs, i))

#define szarex_getfilesize(p, i) ((p)->unpackpositions[(i) + 1] - (p)->unpackpositions[i])

上面四個巨集函式,szbitarray_check檢查陣列位元位是否為0;szbitwithvals_check檢查資料位元位是否為0;szarex_isdir判斷是否是資料夾;szarex_getfilesize獲取檔案大小。

該標頭檔案中還有一些函式的宣告,它們的實現在7zarcin.c中,後期介紹這個檔案的時候,再詳細說明。

7z檔案格式及其原始碼的分析

本文是乙個系列.主要是分享我最近一年做7z檔案開發的經驗.主要包括7z官方原始碼的結構分析,以及7z檔案格式的分析.其中涉及到7z原始碼結構的各個細節,以及7z檔案格式的具體細節.本文適合物件 想要了解學習7z原始碼的開發人員,想要了解7z檔案格式細節,做7z檔案壓縮器和解壓器的開發人員,以及其他壓...

7z解壓命令

支援 7z,zip,zip64,cab,rar,arj,gzip,bzip2,tar,cpio,rpm,iso,deb 壓縮檔案格式 安裝 sudo apt get install p7zip p7zip full p7zip rar 這條命令是將yajiu.jpg和yajiu.png壓縮成乙個7z...

linux下安裝7z命令及7z命令的使用

本文主要介紹了在linux下安裝7z命令的方法,同時介紹了7z命令的使用。7z壓縮格式擁有眾多優點,具有極高的壓縮比率,如果你還不了解,請看文章 7z格式 lzma壓縮演算法和7 zip詳細介紹。reille使用的linux發行版是ubuntu,同時在redhat上業已驗證,可正常使用。1.linu...