zlib gzip http gizp 压缩,解压缩 isize 内存分配

来源:互联网 发布:梦幻西游mac无法更新 编辑:程序博客网 时间:2024/05/21 10:58

最近做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 thegzip format (the zlib format will return a Z_DATA_ERROR).

意思是15+32自动检测zlib和gzip 15+16则只解压gzip,对于只解压gzip的http gzip场景来说31更加合适。


0 0
原创粉丝点击