2016-05-29 145 views
0

我有這種很簡單的Python代碼:的Python - 字符串改變再次解碼和編碼後(ZLIB +的base64)

in_data = "eNrtmD1Lw0AY..." 
print("Input: " + in_data) 
out_data = in_data.decode('base64').decode('zlib').encode('zlib').encode('base64') 
print("Output: " + out_data) 

它輸出:

Input: eNrtmD1Lw0AY... 
Output: eJztmE1LAkEY... 

該字符串也正確地解碼;如果我顯示in_data.decode('base64').decode('zlib'),它會給出預期的結果。

此外,格式編排兩個字符串是不同的:

Weird formatting

爲什麼不工作的解碼/編碼是否正確?我應該使用某種參數嗎?

+1

格式符合標準base64規則;換行符是允許的,並且優選在76列。也許你的輸入數據使用較重或較輕的壓縮設置? –

+0

請包含*完整輸入字符串*,以便我們可以正確診斷。 –

+0

這是:http://pastebin.com/LUy2Ybs4 – pie3636

回答

1

你對輸入數據與十六進制字節78 DA開始,你開始輸出78 9C

>>> 'eNrt'.decode('base64').encode('hex')[:4] 
'78da' 
>>> 'eJzt'.decode('base64').encode('hex')[:4] 
'789c' 

DA是最高的壓縮級別,9C是默認的。見What does a zlib header look like?

除了使用.encode('zlib')使用zlib.compress() function,一個級別設置爲9:

import zlib 

zlib.compress(decoded_data, 9).encode('base64') 

的base64編碼的輸出插入一個換行每隔76個字符,以使其適合於MIME封裝(電子郵件) 。您可以使用base64.b64encode() function來代替沒有換行符的編碼。

+0

謝謝!這確實解決了它。 – pie3636