1

我有一个例子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'

我在这里想念什么?为什么这两个返回相同的结果?

4

1 回答 1

2

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

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

于 2013-05-04T02:49:00.393 回答