为什么我不能用zlib像gzip一样解压字符串
我知道关于如何使用Python中的zlib或gzip模块解压数据的问题和答案有很多。但是我很好奇gzip是怎么实现的,因为gzip是基于zlib的。
我查看了gzip的源代码,发现它是通过设置wbits为-15来使用zlib逐块解压数据的。
但是当我直接用zlib设置wbits为-15来解压时,它告诉我“无效的块类型”,只有设置wbits为15+16时才能正常工作。
我知道为什么我应该使用15+16,但我不知道为什么gzip可以使用-15而我不行。
谁能告诉我我和gzip模块之间实现上的区别是什么?
1 个回答
2
zlib模块会把wbits
这个参数直接传给实际的zlib库。在zlib库里,这个参数叫windowBits
,具体的说明可以在zlib手册里找到。让我引用一下相关的内容:
windowBits的值也可以是–8到–15,用于原始的压缩。在这种情况下,-windowBits决定了窗口的大小。deflate()函数会生成没有zlib头部或尾部的原始压缩数据,并且不会计算adler32校验值。
因为gzip模块自己负责处理头部的解析和生成,所以它需要告诉zlib不要再处理头部。否则就会出现两个zlib头部,导致压缩文件损坏。