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'

ここで何が欠けていますか?これらの 2 つが同じ結果を返すのはなぜですか?

4

1 に答える 1

2

それは、入力が与えられたときに利用できる解凍されたデータの量だからです。を使用すると、圧縮データのオブジェクト チャンクを供給するzlib.decompressobj()ことができ、可能な限り多くの圧縮解除されたデータが返されます。その後、さらに餌を与えて、より多くを得ることができます。

最終的な Adler-32 チェック (4 バイト) をノックオフしているため、最後の 4 バイトまたは 5 バイトのみを切り取った場合、圧縮解除されたすべてのデータを取得できます。バイト境界に持ってきます (もう 1 バイト)。これらはすべてのデータを解凍するために必要なわけではなく、データの終わりをマークし、データの整合性をチェックするためにのみ必要です。

于 2013-05-04T02:49:00.393 に答える