zlib是一個(gè)通用的壓縮開(kāi)源庫(kù),提供了在內(nèi)存中壓縮和解壓的函數(shù),包括對(duì)解壓后數(shù)據(jù)的校驗(yàn)。目前版本的zlib只支持deflate方法,但是其它的方法將會(huì)被添加進(jìn)來(lái)并且擁有同樣的接口。
—— zlib manaul
deflate算法在rfc1951中有詳細(xì)的說(shuō)明。
zlib同時(shí)又是一種數(shù)據(jù)格式,使用zlib庫(kù)壓縮后的數(shù)據(jù)會(huì)在deflate數(shù)據(jù)的頭和尾添加信息,形成zlib格式的數(shù)據(jù)。
gzip也是一種數(shù)據(jù)壓縮格式,可以大體分為頭部,數(shù)據(jù)部和尾部三個(gè)部分,其中頭部和尾部主要是一些文檔屬性和校驗(yàn)信息(rfc1952),數(shù)據(jù)部主要是用deflate方法壓縮得到的數(shù)據(jù)。
zlib庫(kù)默認(rèn)的壓縮方法并不是gzip的,而是zlib的,因此使用zlib壓縮得到gzip格式的數(shù)據(jù)有兩種方法:
1. 使用zlib提供的gz***系列函數(shù)可以直接把想要的內(nèi)容寫入一個(gè)磁盤gzip文件;
2. 如果想在內(nèi)存中生成gzip格式的數(shù)據(jù),可以在初始化的時(shí)候調(diào)用inflateInit2函數(shù),并指定為gzip格式,代碼如下:
z_stream d_stream; d_stream.zalloc = NULL; d_stream.zfree = NULL; d_stream.opaque = NULL; int ret = deflateInit2(&d_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, DEFAULT_WINDOWSIZE, DEFAULT_MEMLEVEL, Z_DEFAULT_STRATEGY);
if (Z_OK != ret) { printf("init deflate error\n"); return ret; } |
之后,用deflate壓縮出來(lái)的數(shù)據(jù)就是gzip的了。