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更加合適。