2013-02-26 119 views
0

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

>>> 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 

有没有人知道为什么会发生这种情况?

回答

9

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 
2

然而,LEN(compressedString)并不总是小于 LEN(originalString)。

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

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