簡體   English   中英

如何使用miniz創建一個可以通過gzip解壓縮的壓縮文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM