【问题标题】:python b64decode incorrect paddingpython b64decode不正确的填充
【发布时间】:2011-08-31 10:23:14
【问题描述】:

我正在通过小型 UDP 数据包发送文件。 (蟒蛇3) 在服务器上,我将文件分成小块并执行

packets.append(b64encode(smallPart))

在另一边,我完全相反

packets.append(b64decode(peice))    

但是,我不断收到(除了数据包之外)不正确的填充异常

我缺少 b64decode 的标准尺寸吗?

【问题讨论】:

  • 您确定您发送的数据就是您收到的数据吗?您可以随时添加assert b64decode(b64encode(smallPart)) == smallPart 以确保这些功能正常工作(它们可以)。

标签: python python-3.x base64


【解决方案1】:

Base 64 通过将每 3 个字节编码为 4 个字节来工作。解码时,它需要这 4 个字节并将它们转换回 3 个字节。如果输入中剩余的字节少于 3 个,则输出仍会用 '=' 填充以形成 4 个字节。如果 b64decode 的输入不是 4 字节的倍数,则会出现异常。

对您来说最简单的解决方案是确保您的数据包始终是 4 字节的倍数。

【讨论】:

  • 3 个字节转换成 4 个字符需要 3 的倍数而不是 4!
  • 3 字节输入 = 4 字节输出,所以他说你应该以 4 的倍数结束。
  • @msshapira,我的术语很草率,我会修正它。
  • -1 您应该能够将输入分解为任意大小的片段,传输每个片段,解码每个片段,并加入解码片段列表。如果输入大小不是三的倍数,则 Base 64 编码例程填充输出。因此,将输入分解为(主要是)3 的倍数大小的片段更有效,但不是必需的。
  • @Mark Ransom:重点是让 7 位干净的无特殊含义数据通过网络传输,这以字节为单位——与 Unicode 文本完全无关.使数据包成为 4 的倍数是正确解决方案的副作用;它本身并不是一个解决方案。
【解决方案2】:

任何正确编码的 base64 字符串的长度都应该能被 4 整除。

Base64 将 3 个字节编码为 4,因此如果您开始时字符串长度不是 3 的倍数,算法会在编码形式的末尾添加一个或两个 = 字符,每个字节对应一个 shy 3 的某个倍数(参见http://en.wikipedia.org/wiki/Base64#Padding)。

对齐的方式,= 字符数也等于编码形式中小于 4 的倍数的字符数。

【讨论】:

    【解决方案3】:

    您对您正在做的事情的描述听起来不错。输入件尺寸的选择仅影响效率。如果每个输入片段(当然最后一个片段除外)的长度是 3 的倍数,则填充字节被最小化。

    您需要向我们展示您的服务器代码和客户端代码。或者:在服务器上,记录输入和传输的片段。在客户端上,记录收到的片段。比较。

    好奇心:为什么不直接对整个字符串进行 b64 编码,根据需要拆分编码结果,传输片段,在客户端使用 b''.join(pieces) 和 b64decode 重新组装片段?

    进一步的好奇:我认为 UDP 数据包的内容可能是任何旧的二进制字节串;为什么要进行 base64 编码?

    【讨论】:

    • Machin:好奇:我正在将结果写入标准输出,对于大文件,加入的影响会很大进一步好奇:编码以隐藏数据,尝试通过 dns 协议加密文件
    • @msshapira: b64encode != 加密,它不隐藏任何东西;事实上,base64 数据很容易被识别出来。无论如何,你发现你的问题是什么了吗?您打算接受答案吗?
    【解决方案4】:

    我一直在尝试解码 URL 安全的 base64 编码字符串。简单地替换“。”用“=”对我有用。

    s = s.replace('.', '=')
    # then base64decode
    

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多