2016-09-28 3 views
1

Я пытаюсь декодировать многострочный файл base64 через стандартную библиотеку python, однако только первая строка декодируется, а остальная часть сбрасывается без причины.Python 3 Base64 декодирует испортить символы новой строки

Почему это?

файл перед ним будет закодирован (то, что я пытаюсь достичь после декодирования):

datafile.dat

версия: BenWin + Версия: 3.0.12.1 [CR]

[CR] [LF]

СОЗДАНО: 1 сентября 2016 12:56:27 PM [CR]

[CR] [LF]

TIME CODE: 0x907e0, 0x10004, 0x38000c, 0x242001b [CR]

[CR] [LF]

...

[CR] и [LF] являются характер коды для возврата каретки (\ r) и подачи строки (\ n) соответственно

I base64 кодирует файл с использованием base64.b64encode и хочет его позднее декодировать. Вот мой фрагмент кода.

encodedData = b'VkVSU0lPTjogQmVuV2luKyBWZXJzaW9uOiAzLjAuMTIuMQo=Cg==Q1JFQVRFRDogMDEgU2VwdGVtYmVyIDIwMTYgMTI6NTY6MjcgUE0KCg==VElNRSBDT0RFOiAweDkwN2UwLCAweDEwMDA0LCAweDM4MDAwYywgMHgyNDIwMDFiCg==Cg==' 

data = base64.b64decode(encodedData) 
print(data) 

Который возвращает

b'VERSION: BenWin + Версия: 3.0.12.1 \ п»

Спасибо заранее. Использование Python 3.5

+0

Вы Base64 кодирующая его самостоятельно? –

+0

Если бы я мог изменить символы конца строки через регулярное выражение, изменил бы его исключительно \ n или \ r help? Или, возможно, избавиться от пустых строк? – Pingk

+0

@ PM2Ring Да, следует ли добавлять дополнительные параметры в операцию кодирования? – Pingk

ответ

1

Проблема заключается в том, что вы кодируете каждую строку отдельно и затем соединяете эти закодированные строки вместе. Строка с кодировкой Base-64 может заканчиваться символами заполнения, и когда декодер видит эти символы заполнения, он предполагает, что это конец действительных данных, поэтому любые последующие данные игнорируются.

Вот как Base64 кодирует многострочный текст в Python 3. Сначала нам нужно преобразовать текст Unicode в байты. Затем Base64 кодирует все эти байты за один раз. Для декодирования мы отменяем процесс: сначала Base64 декодируем, а затем декодируем результирующие байты в строку Unicode. Обратите внимание, что и \n сохранены должным образом.

import base64 

s = 'VERSION: BenWin+ Version: 3.0.12.1\r\r\nCREATED: 01 September 2016 12:56:27 PM\r\r\nTIME CODE: 0x907e0, 0x10004, 0x38000c, 0x242001b\r\r\n' 
print(s) 

b = base64.b64encode(s.encode('utf8')) 
print(b) 

z = base64.b64decode(b).decode('utf8') 
print(repr(z)) 

выход

VERSION: BenWin+ Version: 3.0.12.1 
CREATED: 01 September 2016 12:56:27 PM 
TIME CODE: 0x907e0, 0x10004, 0x38000c, 0x242001b 

b'VkVSU0lPTjogQmVuV2luKyBWZXJzaW9uOiAzLjAuMTIuMQ0NCkNSRUFURUQ6IDAxIFNlcHRlbWJlciAyMDE2IDEyOjU2OjI3IFBNDQ0KVElNRSBDT0RFOiAweDkwN2UwLCAweDEwMDA0LCAweDM4MDAwYywgMHgyNDIwMDFiDQ0K' 
'VERSION: BenWin+ Version: 3.0.12.1\r\r\nCREATED: 01 September 2016 12:56:27 PM\r\r\nTIME CODE: 0x907e0, 0x10004, 0x38000c, 0x242001b\r\r\n' 
+0

Удивительно, когда вы сказали, что конкатенация закодированных строк неверна, я сразу же подумал, что это может быть проблема с заполнением. Спасибо, что объяснили, как это исправить :) – Pingk