2016-09-28 99 views
1

我試圖通過標準的python庫解碼base64多行文件,但只有第一行被解碼,其餘的被無端甩掉。Python 3 Base64解碼搞亂換行符

這是爲什麼?

以前它的文件被編碼的(我嘗試解碼後實現):

dataFile.dat

版本:BenWin +版本:3.0.12.1 [CR]

[CR] [LF]

CREATED:2016 09月01日下午12時56分27秒[CR]

[CR] [LF]

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

[CR] [LF]

...

[CR]和[LF]是字符分別爲回車符(\ r)和換行符(\ n)的代碼

我base64使用base64.b64encode對文件進行編碼,並希望稍後解碼。這是我的代碼片段。

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

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

它返回

b'VERSION:BenWin +版本:3.0.12.1 \ n」

在此先感謝。 使用Python 3.5

+0

難道它自己呢? –

+0

如果我可以通過正則表達式更改末尾字符,是否將它改爲專有\ n或\ r幫助?或者也許擺脫空行? – Pingk

+0

@ PM2Ring是的,我應該在編碼操作中添加其他選項嗎? – Pingk

回答

1

問題似乎是,您要分別編碼每行,然後將這些編碼字符串連接在一起。一個Base-64編碼的字符串可能以填充字符結尾,並且當解碼器看到這些填充字符時,它認爲這是有效數據的末尾,因此後面的任何數據都將被忽略。

下面是如何在Python 3中對Base64進行多行文本編碼。首先,我們需要將Unicode文本轉換爲字節。然後我們Base64一次對所有這些字節進行編碼。爲了解碼,我們逆過程:首先Base64解碼,然後將結果字節解碼爲Unicode字符串。請注意,\r\n已妥善保存。您編碼的Base64

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