【问题标题】:Base64 Incorrect padding error using Python使用 Python 的 Base64 不正确的填充错误
【发布时间】:2017-04-05 09:15:15
【问题描述】:

我正在尝试将 Base64 解码为十六进制以获取大约 200 个 Base64 数据,但出现以下错误。它对其中的 60 个进行解码,然后停止。

ABHvPdSaxrhjAWA=
0011ef3dd49ac6b8630160
ABHPdSaxrhjAWA=
Traceback (most recent call last):
  File "tt.py", line 36, in <module>
    csvlines[0] = csvlines[0].decode("base64").encode("hex")
  File "C:\Python27\lib\encodings\base64_codec.py", line 43, in base64_decode
    output = base64.decodestring(input)
  File "C:\Python27\lib\base64.py", line 325, in decodestring
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

一些来自 CSV 的原始 Base64 源代码

ABHPdSaxrhjAWA=
ABDPdSaxrhjAWA=
ABDPdSaxrhjAWA=
ABDPdSaxrhjAWA=
ABDPdSaxrhjAWA=
ABDPdSaxrhjAWA=
ABDPdS4xriiAVQ=
ABDPdSqxrizAU4=
ABDPdSrxrjPAUo=

【问题讨论】:

  • 错误仍然是文本;请复制并粘贴该文本,无法搜索屏幕截图。
  • 这意味着源文本并非真正来自 base64。你从哪里得到的文字?也许你犯了一个剪切粘贴错误?
  • @JohnGordon:不,这也可能意味着缺少填充​​。填充对于解码实际上不是强制性的,它仅在您想检测不完整的传输时才有用。
  • 您的所有示例字符串都是 1 个填充字符短。一个有效的值(在你的回溯之上),还有一个字符(v)。
  • @MartijnPieters 如果编码的文本缺少=,我会很紧张,只是在末尾添加一个。显然文本被改变了;我们如何确定丢失的字符不在中间的某个地方?

标签: python hex base64


【解决方案1】:

您的 CSV 文件中至少有一个字符串不是 Base64 字符串、损坏(损坏)的 Base64 字符串或缺少所需的 = 填充的字符串。您的示例值 ABHPdSaxrhjAWA= 是短一个 = 缺少另一个数据字符。

经过适当填充的 Base64 字符串的长度是 4 的倍数,因此您可以轻松地重新添加填充:

value = csvlines[0]
if len(value) % 4:
    # not a multiple of 4, add padding:
    value += '=' * (4 - len(value) % 4) 
csvlines[0] = value.decode("base64").encode("hex")

如果仍然的值无法解码,那么您的输入已损坏或无效的 Base64 开头。

对于示例错误ABHPdSaxrhjAWA=,上面加了一个=使其可解码:

>>> value = 'ABHPdSaxrhjAWA='
>>> if len(value) % 4:
...     # not a multiple of 4, add padding:
...     value += '=' * (4 - len(value) % 4)
...
>>> value
'ABHPdSaxrhjAWA=='
>>> value.decode('base64')
'\x00\x11\xcfu&\xb1\xae\x18\xc0X'
>>> value.decode('base64').encode('hex')
'0011cf7526b1ae18c058'

我需要强调的是,您的数据可能只是被损坏了。您的控制台输出包括一个有效的值和一个失败的值。一个有效的方法是 一个 字符更长,这是唯一的区别

ABHvPdSaxrhjAWA=
ABHPdSaxrhjAWA=

注意第四位的v;第二个示例中缺少此内容。这可能表明您的 CSV 数据发生了一些事情,导致该字符从第二个示例中被删除。添加填充可以使第二个值再次可解码,但结果将是错误。我们无法告诉您这两个选项中的哪一个是这里的原因。

【讨论】:

  • 我刚刚查看了所有 base64 数据,它有一个 = 符号。它解码了其中的 60 个,但即使所有数据看起来都相同,我也会收到该错误
  • @James:但您的示例字符串应该有 两个 = 字符以将其填充到长度 16。Base64 字符串具有 0、1 或 2 个填充字符,具体取决于输入数据长度。
  • 那么它怎么解码其中只有一个 = 字符的呢?
  • @James:因为那些还有一个字符;它们的长度都是 4 的倍数(包括 =)填充字符。
  • 我明白了。谢谢你。当我从原始来源过滤时,似乎我为所有数据删除了一个字符“u”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2019-05-19
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多