python - Python zlib 中的这种意外行为是什么?

标签 python zlib

我在 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/

相关文章:

python - 在 python 中将 r'\x74op' 等十六进制 ASCII 混合字符串转换为 'top'

python - 需要了解这个 python 错误

c++ - 从 PDF 中提取文本

c - 如何在 Windows 上将 libxml2 与 zlib1 链接?

python - 使用 Python 脚本将 .sldprt 文件转换为 .STL

python转换编码:LookupError: unknown encoding: ansi

Python:tkinter askyesno 方法打开一个空窗口

c - zlib 的 CloudFlare 分支是否仅针对 amd 进行了优化?

python - 需要帮助解压缩存储在 Aztec 条形码中的 zlib 数据(德国铁路票)

c++ - 'zlib' 的 Uncompress() 返回 Z_DATA_ERROR