2016-05-29 24 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