[英]How to use miniz to create a compressed file that can be decompressd by gzip?
我在Windows平台上用C ++編寫程序。 我想壓縮存儲在char[]
數組中的一些數據,並將其輸出到文件,稍后我將文件上傳到unix服務器,我希望它可以通過gzip -d
解壓縮。
經過大量的研究,我選擇miniz 。 另外,我在這里找到了gzip文件格式。
這是創建gzip文件的代碼片段:(抱歉,我沒有把一些變量的定義;它們在其他地方定義)
unsigned long zsize;
zpkg[0] = 0x1F;
zpkg[1] = 0x8B;
zpkg[2] = 8;
zpkg[3] = 0;
zpkg[4] = 0;
zpkg[5] = 0;
zpkg[6] = 0;
zpkg[7] = 0;
zpkg[8] = 0;
zpkg[9] = 0xFF;
compress2(zpkg + 10, &zsize, pkg, pkgSize, MZ_DEFAULT_LEVEL);
int footerStart = (int)zsize + 10;
mz_ulong crc = mz_crc32(MZ_CRC32_INIT, zpkg + 10, zsize);
zpkg[footerStart] = crc & 0xFF;
zpkg[footerStart + 1] = (crc >> 8) & 0xFF;
zpkg[footerStart + 2] = (crc >> 16) & 0xFF;
zpkg[footerStart + 3] = (crc >> 24) & 0xFF;
zpkg[footerStart + 4] = pkgSize & 0xFF;
zpkg[footerStart + 5] = (pkgSize >> 8) & 0xFF;
zpkg[footerStart + 6] = (pkgSize >> 16) & 0xFF;
zpkg[footerStart + 7] = (pkgSize >> 24) & 0xFF;
然后只需將zpkg
數組輸出到文件中。 但這不起作用; 當我用gzip解壓縮時,錯誤消息是:
gzip: data stream error
gzip: test.gz: uncompress failed
誰能指出我做錯了什么?
感謝Mark Adler和Michael,我找到了一個有效的解決方案。
首先,正如Mark指出的那樣,我應該讓miniz返回一個原始的deflate數據流。 這可以通過將-MZ_DEFAULT_WINDOW_BITS
(注意減號)傳遞給mz_deflateInit2()
作為第四個參數來完成。 展望miniz源代碼, compress2()
函數最終調用mz_deflateInit2()
與MZ_DEFAULT_WINDOW_BITS
,這意味着添加ZLIB頁眉和頁腳。 所以最簡單的解決方法是在那里添加一個減號,這樣我仍然可以使用compress2()
函數。 (這對我有用,因為我只在一個地方調用此功能)
其次,正如邁克爾指出的那樣,CRC代碼應該在未壓縮數據上計算。 所以我修復它:
mz_ulong crc = mz_crc32(MZ_CRC32_INIT, pkg, pkgSize);
完成上述兩個更改后, gzip -d
不再抱怨了。
compress2()
生成一個zlib流,它使用zlib頭和尾部來壓縮壓縮數據。 對於您正在做的事情,您只需要將原始deflate壓縮流粘貼到手動生成的gzip標頭和預告片中。
您可以:a)丟棄compress2()
輸出的前兩個和后四個字節以deflateInit2()
zlib頭和尾部,b)使用deflateInit2()
, deflate()
和deflateEnd()
而不是compress2()
和選擇原始deflate格式,或c)使用相同的函數,而不是選擇gzip格式,並擺脫手動構造的gzip頭和預告片,因為deflate()
將為你做這件事。
我推薦c)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.