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

在处理HTTP服务端通过GZIP压缩的内容时,需要对其进行解压缩。文章探讨了解压缩过程中如何确定解压后文件的最大大小,通过分析gzip的RFC 1952,发现isize字段指示了未压缩的输入文件大小,可用于预先分配内存。此外,指出国内一些资源对zlib.inflateInit2参数的理解误区,强调在HTTP gzip场景中,使用15+16而非15+32更为合适。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做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更加合适。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值