2013-02-26 53 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流,並且尾部提供對數據的完整性檢查。