我在 zlib
中有一个示例,它给出了意外的结果。
如果我从压缩一个简单的字符串开始:
>>> import zlib
>>> import binascii
>>> compressed = binascii.hexlify(zlib.compress('first_message'))
>>> compressed
'789c4bcb2c2a2e89cf4d2d2e4e4c4f05002651056d'
现在,如果我做相反的事情,我就会得到我所期望的结果:
>>> zlib.decompress(compressed.decode("hex"))
'first_message'
但是,如果我尝试这样做,我会得到意想不到的结果:
>>> d = zlib.decompressobj()
>>> d.decompress(compressed.decode("hex"))
'first_message'
>>> d = zlib.decompressobj()
>>> d.decompress(compressed[:-2].decode("hex"))
'first_message'
我在这里缺少什么?为什么这两个返回相同的结果?
最佳答案
因为这是给定输入的可用解压缩数据量。 zlib.decompressobj()
允许您提供压缩数据的对象 block ,并将返回尽可能多的解压缩数据。然后你可以喂它更多以获得更多。
如果只截掉最后四或五个字节,您将获得所有解压缩的数据,因为您正在取消最终的 Adler-32 检查(四个字节),并且可能只有最后一个 deflate block 的结束代码和一些未使用的位将其带到字节边界(多一个字节)。这些不需要解压缩所有数据,而只需要标记数据的结尾并提供对数据完整性的检查。
关于python - Python zlib 中的这种意外行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369719/