Python - 再次解码和编码后字符串发生变化(zlib + base64)

Python - String changing after decoding and encoding again (zlib + base64)

我有这个非常简单的 Python 代码:

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'),它会给出预期的结果。

此外,两个字符串的格式不同:

为什么 decoding/encoding 无法正常工作?我应该使用某种参数吗?

您的输入数据以十六进制字节 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封装(emailing)。您可以使用 base64.b64encode() function 来编码而不使用换行符。