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