为什么我不能像gzip那样使用zlib解压字符串
我知道这里有很多关于使用 python 中的 zlib 或 gzip 模块解压缩数据的问题和答案。但我很好奇 gzip 如何实现它,因为 gzip 是基于 zlib 的。
我阅读了 gzip 的源代码,发现它使用 zlib 逐块解压缩数据,并将 wbits 设置为 -15。
然而,当我直接使用 zlib 和 wbits -15 解压缩时,它告诉我“无效的块类型”,只有 wbits 15+16 才可以工作。
我知道为什么我应该使用 15+16,但是我不知道为什么 gzip 可以使用 -15 但我不能。 谁知道我的模块和 gzip 模块之间的实现差异?
I know here has many questions and answers about decompress data with zlib or gzip module in python. But I'm curious about how gzip implement it since gzip is based on zlib.
I read gzip's source and found it's using zlib to decompress data chunk by chunk with wbits set to -15.
However when I directly use zlib with wbits -15 to decompress, it tells me "invalid block type", only with wbits 15+16 it can works.
I know why I should use 15+16, however I don't know why gzip can use -15 but I can't.
Who knows the differences of implementations between mine and gzip modules?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
zlib 模块直接将
wbits
参数传递给实际的 zlib 库。它被称为windowBits
并记录在 zlib 手册中。让我引用相关部分:由于 gzip 模块自己进行标头解析和生成,因此它需要告诉 zlib 避免它。否则将会有两个 zlib 标头和一个损坏的压缩文件。
The zlib module passes the
wbits
parameter directly the actual zlib library. There it is calledwindowBits
and is documented in the zlib manual. Let me quote the relevant section:Since the gzip module does the header parsing and generation itself, it needs to tell zlib to avoid it. Otherwise there would be two zlib headers and a broken compressed file.