我无法理解为什么
import base64
base64.b32decode('siddh===', casefold=True);
有效但
base64.b32decode('siddha==', casefold=True);
引发
TypeError: Incorrect padding
答案 0 :(得分:2)
python base64模块跟在RFC 3548之后。对于base32编码,
结束时的填充 使用“=”字符执行数据。由于所有基地32 输入是八位字节的整数,只有以下情况才可以 出现:
(1)编码输入的最终量子是40的整数倍 位;这里,编码输出的最后一个单元将是一个整数 多个8个字符,没有“=”填充,
(2)编码输入的最终量子正好是8位;在这里, 编码输出的最终单位是两个字符,后跟六个字符 “=”填充字符,
(3)编码输入的最终量子正好是16位;在这里, 编码输出的最终单位是四个字符,后跟四个字符 “=”填充字符,
(4)编码输入的最终量子正好是24位;在这里, 编码输出的最终单位将是五个字符,然后是 三个“=”填充字符,或
(5)编码输入的最终量子正好是32位;在这里, 编码输出的最终单位将是七个字符,后跟一个 “=”填充字符。
您可以看到RFC 3548 base32编码没有有效的情况会导致六个字符和两个填充字符。
五个字符总共提供25位,因此用一个额外位编码三个字节就足够了。六个字符总共会给你30位,对于四个字节来说仍然不够。使用七个字符可获得35位,这足以容纳四个字节。由于六个字符对于编码整数个字节不超过五个字符,因此它将从标准中排除在包含填充的八个字符的最终填充40位输入组的标准之外。
答案 1 :(得分:0)