1. 程式人生 > >Zlib庫學習總結

Zlib庫學習總結

zlib類庫提供了很多種壓縮和解壓縮的方式,由於時間的關係我只學習一下內容,以下是我在實現web 伺服器壓縮資料網頁中使用到一些函式和常用資料結構、常量等。 zlib使用過程 壓縮過程:deflateInit() ->deflate() ->deflateEnd();  對應的解壓過程 inflateInit() ->  inflate() ->  inflateEnd();  壓縮過程:deflateInit2() ->deflate() ->deflateEnd();  對應的解壓過程 inflateInit2() ->  inflate() ->  inflateEnd();  常用的資料結構 typedef struct z_stream_s {     z_const Bytef *next_in;     //要壓縮資料的首地址     uInt     avail_in;  //壓縮資料的長度     uLong    total_in;  //壓縮資料緩衝區的長度     Bytef    *next_out; //壓縮資料儲存位置。     uInt     avail_out; //存放壓縮資料位置的首地址     uLong    total_out; //存放壓縮資料位置的大小     z_const char *msg;  //存放最近的錯誤資訊,NULL表示沒有錯誤     struct internal_state FAR *state; /* not visible by applications */     alloc_func zalloc;  /* used to allocate the internal state */     free_func  zfree;   /* used to free the internal state */     voidpf     opaque;  /* private data object passed to zalloc and zfree */     int     data_type;  // 表示資料型別,文字或者二進位制     uLong   adler;      /* adler32 value of the uncompressed data */     uLong   reserved;   /* reserved for future use */ } z_stream; 對於z_stream我們一般使用         z_stream stream;         在deflateInit()或者inflateInit()前設定的引數,初始化引數設定         stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = 0; stream.next_in = Z_NULL;         在deflate()或inflate前設定的引數,壓縮前的引數設定         strm.avail_in = in_len;         strm.next_in = in;         strm.avail_out = out_len;         strm.next_out = out; 常用的常量 用來設定壓縮和解壓縮時,結果資料輸出的方式,具體區別沒有看懂的(為了避免誤導大家,大家儘量看http://www.zlib.net/manual.html英文幫助吧) #define Z_NO_FLUSH      0  //沒有快取,直接寫入到結果中 #define Z_PARTIAL_FLUSH 1    #define Z_SYNC_FLUSH    2     #define Z_FULL_FLUSH    3 #define Z_FINISH        4    //採用此種方式,壓縮將會變成單步執行。 #define Z_BLOCK         5 #define Z_TREES         6 函式返回值得定義 #define Z_OK            0 #define Z_STREAM_END    1 #define Z_NEED_DICT     2 #define Z_ERRNO        (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR   (-3) #define Z_MEM_ERROR    (-4) #define Z_BUF_ERROR    (-5) #define Z_VERSION_ERROR (-6) 註釋:負值是錯誤,正值用於特別,但正常活動。 定義常用的壓縮級別 #define Z_NO_COMPRESSION         0 #define Z_BEST_SPEED             1 #define Z_BEST_COMPRESSION       9 #define Z_DEFAULT_COMPRESSION  (-1) 註釋:壓縮級別是一個0-9的數字,0壓縮速度最快(壓縮的過程),9壓縮速度最慢,壓縮率最大,0不壓縮資料 壓縮演算法的選擇 #define Z_FILTERED            1    //Huffman編碼和字串匹配結合 #define Z_HUFFMAN_ONLY        2  //僅採用霍夫曼編碼,沒有字元匹配 #define Z_RLE                 3    //限制相匹配的距離為1 #define Z_FIXED               4 #define Z_DEFAULT_STRATEGY    0  //預設壓縮方法。 Possible values of the data_type field (though see inflate()). #define Z_BINARY   0 #define Z_TEXT     1 #define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN  2 預設的壓縮方式,僅支援當前一種 #define Z_DEFLATED   8 常用的函式 int deflateInit ((z_streamp strm, int level)); include: zlib.h description: 初始化壓縮狀態,關聯相關的z_stream資料結構和壓縮比例 parameter:     strm: 要關聯的z_stream資料結構     level:壓縮比例,壓縮級別是一個0-9的數字,0壓縮速度最快(壓縮的過程),9壓縮速度最慢,壓縮率最大,0不壓縮資料 int deflateInit2 ((z_streamp strm, //關聯的資料結構                                int  level,                                   int  method,                                int  windowBits,                                int  memLevel,                                 int  strategy)); include: zlib.h description: 壓縮的初始化 parameter:     strm:關聯的資料結構         level:壓縮級別,壓縮級別是一個0-9的數字,0壓縮速度最快(壓縮的過程),9壓縮速度最慢,壓縮率最大,0不壓縮數     method:壓縮的模式,現在只有一種。Z_DEFLATED(表示數字8)     windowBits:表示處理raw deflate的方法。windowBits為8..15,也可以為-8...-15。當值為16時,將會加上一個簡單gzip頭部和尾部。     memLevel:指定的內部壓縮狀態,應該分配多少記憶體。 memLevel=1使用的最小記憶體,但很慢,降低了壓縮比; memLevel=9使用的最大記憶體以獲得最佳的速度。預設值是8。請參閱作為的函式windowBits和memLevel的使用的總記憶體zconf.h。     strategy:壓縮的策略 int deflate ((z_streamp strm, int flush)); include: zlib.h description: 壓縮資料 parameter:     strm: 關聯的資料結構,要壓縮的資料、長度、壓縮資料的存放位置和可用大小,都在其中設定的     flush: 採用何種法師將壓縮的資料寫到緩衝區中。 int deflateEnd ((z_streamp strm)) include: zlib.h description: 壓縮結束 parameter:     strm: 關聯的資料結構,釋放資源