Zlib庫學習總結
阿新 • • 發佈:2019-02-13
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: 關聯的資料結構,釋放資源