我正在通过小型UDP数据包发送文件。 (python 3) 在服务器上,我将文件分成小块并执行
packets.append(b64encode(smallPart))
另一方面,我做的恰恰相反
packets.append(b64decode(peice))
然而,我一直在(除了数据包之外)得到不正确的填充异常
我缺少b64decode的标准尺寸吗?
答案 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