1

目前,我正在浏览 python.org 的 python 教程。我在 10.9 上,我正在尝试使用 zlib 库来压缩字符串。但是,len(compressedString)并不总是小于len(originalString)。我的解释器代码如下:

>>> import zlib
>>> s = 'the quick brown fox jumps over the lazy dog'
>>> len(s)
43
>>> t = zlib.compress(s)
>>> len(t)
50
>>> t
'x\x9c+\xc9HU(,\xcdL\xceVH*\xca/\xcfSH\xcb\xafP\xc8*\xcd-(V\xc8/K-R(\x01J\xe7$VU*\xa4\xe4\xa7\x03\x00a<\x0f\xfa'
>>> len(zlib.decompress(t))
43
>>> s2 = "something else i'm compressing"
>>> len(s2)
30
>>> t2 = zlib.compress(s2)
>>> len(t2)
37
>>> s3 = "witch which has which witches wrist watch"
>>> len(s3)
41
>>> t3 = zlib.compress(s3)
>>> len(t3)
37

有谁知道为什么会这样?

4

2 回答 2

11

zlib 压缩算法并不总是有效的:

>>> len(zlib.compress('ab'))
10

因为它需要添加可能比您尝试压缩的数据更多的元数据(标头、符号表、反向引用)。将它用于更长的、不那么随机的数据,它会很好地压缩数据:

>>> lorem = 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit'
>>> len(lorem) * 100
9100
>>> len(zlib.compress(lorem * 100))
123
于 2013-02-26T21:42:19.030 回答
2

但是,len(compressedString) 并不总是小于 len(originalString)。

那当然是不可能的。至少如果您希望始终能够无损地检索原始字符串。

然而,deflate 算法的扩展永远不会超过一小部分,加上 zlib 头和尾的六个字节。zlib 标头将其标识为 zlib 流,而尾部则提供对数据的完整性检查。

于 2013-02-27T04:53:28.160 回答