Python 3 Base64解码混淆换行符

3
我正在尝试通过标准Python库解码一个多行的base64文件,但只有第一行被解码了,其余的却没有任何原因地被丢弃了。
为什么会这样呢?
在编码之前,文件如下所示(我想在解码后实现这个):
dataFile.dat VERSION: BenWin+ Version: 3.0.12.1[CR] [CR][LF] CREATED: 01 September 2016 12:56:27 PM[CR] [CR][LF] TIME CODE: 0x907e0, 0x10004, 0x38000c, 0x242001b[CR] [CR][LF] ...
[CR]和[LF]分别是回车符(\r)和换行符(\n)的字符代码
我使用base64.b64encode对文件进行base64编码,并希望稍后进行解码。以下是我的代码片段。
encodedData = b'VkVSU0lPTjogQmVuV2luKyBWZXJzaW9uOiAzLjAuMTIuMQo=Cg==Q1JFQVRFRDogMDEgU2VwdGVtYmVyIDIwMTYgMTI6NTY6MjcgUE0KCg==VElNRSBDT0RFOiAweDkwN2UwLCAweDEwMDA0LCAweDM4MDAwYywgMHgyNDIwMDFiCg==Cg=='

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

返回的结果为:

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

提前感谢。使用 Python 3.5。


你是自己进行Base64编码吗? - PM 2Ring
如果我能通过正则表达式更改行尾字符,将其专门更改为 \n 或 \r 是否有帮助?或者也许去掉空行会更好? - Pingk
@PM2Ring 是的,我应该在编码操作中添加其他选项吗? - Pingk
你不应该像那样将单个Base64编码的字符串连接在一起。我很快会发布一个答案,展示如何进行编码和解码。 - PM 2Ring
1个回答

5
问题似乎在于您分别对每行进行编码,然后将这些编码字符串拼接在一起。Base64编码的字符串可能以填充字符结尾,当解码器看到这些填充字符时,它会认为那是有效数据的结尾,因此会忽略任何后续数据。
以下是如何在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'

太棒了,当你说将编码的字符串连接起来是错误的时候,我立刻想到可能是一些填充问题。谢谢你解释如何修复它 :) - Pingk
不用担心,@Jessie!请注意,base64编码有几种不同的“风味”,base64模块文档解释了它们之间的区别。现在,我们大多数时候需要使用适用于URL的base64版本。 - PM 2Ring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接