1. 程式人生 > >zlib gzip http gizp 壓縮,解壓縮 isize 記憶體分配

zlib gzip http gizp 壓縮,解壓縮 isize 記憶體分配

最近做http的專案時遇到了關於gzip解壓的問題。

說下問題:

http服務端通過gzip方式壓縮的內容,需要對其進行解壓。

問題來了:

壓縮後的內容B解壓後為A,解壓後的大小A最大可以達到5MB,但是一般來說只有幾百KB。

解壓:

查看了 http://zlib.net/ 的各種文章。也在網路上搜索了一遍。

大致的方法如下:

但是都沒有一個提前計算出壓縮後文件大小的方法。再看 zlib.net上面的文章,壓縮檔案有defaltebound函式可以提前計算大小。

但是解壓卻沒有類似的inflatebound。

好吧不臭屁了。直接來。

如何獲取gzip解壓後的大小:

懷著最後一試的心態,查看了gzip的RFC rfc1952(有興趣的自己去找)

文章說了gzip的格式結構: isize最後4位元組是uncompressed input size未壓縮的輸入檔案大小。

用在beyond compare中檢視我上午壓縮好的gzip檔案,解壓後大小為XXXByte, 換算成16進製為0xXXXByte。

在beyond compare中的最後我找到了0xXXXbyte的字樣。

這樣就可以提前獲取gzip壓縮後的大小:取後4位元組(注意大小端),然後分配對應大小的記憶體即可。

國內網站上的主要問題:

大多數人都沒有去看zlib.net官網上的英文原文。

看了的不夠深入,好幾篇部落格說解壓gzip時inflateInit2的引數只能夠為47即15+32, 但是zlib的原話是:

Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR).

意思是15+32自動檢測zlib和gzip 15+16則只解壓gzip,對於只解壓gzip的http gzip場景來說31更加合適。