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

2024-04-24 13:15:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在zlib中有一个示例,它给出了一个意外的结果。在

如果我从压缩一个简单的字符串开始:

>>> import zlib
>>> import binascii
>>> compressed = binascii.hexlify(zlib.compress('first_message'))
>>> compressed
'789c4bcb2c2a2e89cf4d2d2e4e4c4f05002651056d'

现在,如果我反过来做,我会得到我所期望的:

^{pr2}$

但是,如果我这样做,我会得到一个意想不到的结果:

>>> d = zlib.decompressobj()
>>> d.decompress(compressed.decode("hex"))
'first_message'
>>> d = zlib.decompressobj()
>>> d.decompress(compressed[:-2].decode("hex"))
'first_message'

我错过了什么?为什么这两个返回相同的结果?在


Tags: 字符串import示例messagecompressdecompresscompressedfirst
1条回答
网友
1楼 · 发布于 2024-04-24 13:15:08

因为这就是给定输入的解压数据量。zlib.decompressobj()允许您向对象提供压缩数据的块,并将返回尽可能多的解压缩数据。你可以喂它更多的食物来获得更多。在

如果只删除最后的四个或五个字节,您将得到所有解压缩的数据,因为您正在取消最后的Adler-32检查(四个字节),并且可能只删除最后一个deflate块的结束代码和一些未使用的位,以将其带到一个字节边界(多出一个字节)。这些并不需要解压所有的数据,而是只需要标记数据的结尾,并提供对数据完整性的检查。在

相关问题 更多 >