【问题标题】:Python 3 Base64 decode messing up newline charactersPython 3 Base64 解码弄乱换行符
【发布时间】:2016-09-28 14:35:18
【问题描述】:

我正在尝试通过标准 python 库解码一个 base64 多行文件,但是只有第一行被解码,其余的被无缘无故地转储。

这是为什么?

编码前的文件(解码后我想要实现的):

数据文件.dat

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

[CR][LF]

创建时间:2016 年 9 月 1 日下午 12:56:27[CR]

[CR][LF]

时间码:0x907e0、0x10004、0x38000c、0x242001b[CR]

[CR][LF]

...

[CR] 和 [LF] 分别是回车 (\r) 和换行 (\n) 的字符代码

我使用 base64.b64encode 对文件进行 base64 编码,并希望稍后对其进行解码。这是我的代码 sn-p。

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

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

返回

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

提前致谢。 使用 Python 3.5

【问题讨论】:

  • 你自己是 Base64 编码的吗?
  • 如果我可以通过正则表达式更改结束行字符,将其更改为专门的 \n 或 \r 有帮助吗?或者也许摆脱空行?
  • @PM2Ring 是的,我应该在编码操作中添加其他选项吗?
  • 您不应该像那样将单个 Base64 编码的字符串连接在一起。我将很快发布一个答案,说明如何编码和解码。

标签: python base64 decoding


【解决方案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'

【讨论】:

  • 太棒了,当你说连接编码字符串是错误的时,我立即认为这可能是一些填充问题。感谢您解释如何解决它:)
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 2012-11-13
  • 2021-10-31
相关资源
最近更新 更多