python b64decode不正确的填充

时间:2011-05-23 19:58:38

标签: python python-3.x base64

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

packets.append(b64encode(smallPart))
另一方面,我做的恰恰相反

packets.append(b64decode(peice))    

然而,我一直在(除了数据包之外)得到不正确的填充异常

我缺少b64decode的标准尺寸吗?

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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

好奇心:你为什么不直接对整个字符串进行b64编码,然后按照你喜欢的方式拆分编码结果,传输各个部分,在客户端使用b''.join(pieces)和b64解码重新组合部分?

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

答案 2 :(得分:2)

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

Base64将3个字节编码为4,所以如果你的字符串长度不是3的倍数,算法会在编码格式的末尾添加一个或两个=字符,每个字符一个字节害羞的是3的倍数(见http://en.wikipedia.org/wiki/Base64#Padding)。

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

答案 3 :(得分:1)

我一直在尝试解码一个URL安全的base64编码字符串。简单地替换“。”用“=”为我做了诀窍。

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