2012-12-07 101 views
3

我有一個關於使用zlib庫壓縮數據的問題。 我想設置zlib(即deflateInit函數),使壓縮數據的二進制等於命令生成的數據:gzip -9。這可能嗎? 預先感謝您設置zlib生成壓縮數據

回答

2

您無法獲得與gzip完全相同的輸出。但是,您可以獲得與gzip兼容的輸出,以便gzip可以對其進行解壓縮。您需要使用deflateInit2()

+0

我有同樣的問題掙扎。我發現了zlib FAQ(顯然是你寫的),它解釋了相同的解決方案 - 使用deflateInit2()。但是,基於deflateInit2的大量文檔,對於我如何要求zlib生成gzip兼容數據仍然不是很明顯。 '策略'似乎是最有可能調整的參數。你能澄清嗎?我也嘗試僞造一個gzip頁眉和頁腳,但我無法欺騙'gunzip'。 –

+0

該文檔位於zlib.h中。你在讀那個嗎?這裏都是純英文的。它在'deflateInit2'下面說:_「對於可選的gzip編碼,windowBits也可以大於15,在windowBits中添加16來寫一個簡單的gzip頭文件和尾部壓縮數據而不是zlib wrapper。」_ –

+0

好的,我看到了那現在。因此,如果我正在閱讀該更正,windowBits應該在8-15之間,如果要用gzip包裝,則會添加16。我試着用15 + 16的windowBits調用deflateInit2(),但它返回一個流錯誤(-2)。請注意,該程序使用deflateInit()/ deflate()正確生成zlib數據。 –

6

windowsBits參數的默認值是15。
添加16這將是31
15 | 16個返回31

z_stream strm; 
unsigned char* in = DATA TO COMPRESS; 

strm.zalloc = Z_NULL; 
strm.zfree = Z_NULL; 
strm.opaque = Z_NULL; 
strm.next_in = in; 

int windowsBits = 15; 
int GZIP_ENCODING = 16; 

deflateInit2 (&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 
       windowBits | GZIP_ENCODING, 
       8, 
       Z_DEFAULT_STRATEGY)); 

http://www.lemoda.net/c/zlib-open-write/index.html