2016-09-28 20 views
1

標準のPythonライブラリでbase64のマルチラインファイルをデコードしようとしていますが、最初の行だけがデコードされ、残りは何も理由なくダンプされます。Python 3 Base64デコードで改行文字が壊れる

これはなぜですか?

その前にファイルがエンコードされます(私は、デコード後に達成しようとしているものを):BenWin +バージョン:3.0.12.1 [CR]

VERSION

dataFile.datを[CR] [LF]

作成:2016年9月1日午前12時56分27秒PM [CR]

[CR] [LF]

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

[CR] [LF]

...

[CR]と[LF]は文字があります

Base64.b64encodeを使用してファイルをエンコードし、後でデコードしたい場合。ここに私のコードスニペットがあります。

b'VERSION返し

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

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

:BenWin +バージョン:3.0.12.1 \ n」は、事前に

感謝を。 Python 3.5を使用

+0

は、あなたはそれを自分でBase64でエンコードしますか? –

+0

正規表現でendline文字を変更できたら、それを\ nまたは\ rだけに変更すると便利ですか?あるいは、おそらく空の行を取り除くのでしょうか? – Pingk

+0

@ PM2Ringはい、エンコード操作で追加のオプションを追加する必要がありますか? – Pingk

答えて

1

問題は、各行を別々にエンコードしてから、これらのエンコードされた文字列を一緒に結合しているように見えます。 Base-64でエンコードされた文字列は、パディング文字で終わることがあります。デコーダがパディング文字を見ると、それが有効なデータの終わりとみなされるため、以降のデータは無視されます。

ここでは、Python 3で複数行のテキストをBase64でエンコードする方法を説明します。まず、Unicodeテキストをバイトに変換する必要があります。次に、Base64ですべてのバイトを一度にエンコードします。デコードするには、最初にBase64をデコードし、結果のバイトをUnicode文字列にデコードします。 \r\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

関連する問題