不,这不是错误。
在 Base64 的所有变体中,每个编码字符仅代表 6 位,并且根据编码的字节数,您最终可以得到 0、2 或 4 个无意义的位。
在这种情况下,编码字符串1111111111111111111111w
的长度为 23 个字符,这意味着 23*6 = 138 位,可以解码为 17 个字节(136 位)+ 2 个无意义的位。
您在这里使用的编码不是 Base64 而是Hash64
多种哈希格式使用的 Base64 字符映射;排序与标准 base64 字符映射大不相同。
在字符映射
HASH64_CHARS = u("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
中,我们A
在索引 12 ( 001100
) 和w
索引 60 ( 111100
)上找到
现在这里的“技巧”是,它
binary.Base64Engine(binary.HASH64_CHARS)
有一个默认参数 big=False
,这意味着默认情况下以小端格式进行编码。
在您的示例中,这意味着w
is001111
和A
is 001100
。在解码过程中,最后两位被切断,因为它们不需要如上所述。当您再次对其进行编码时,A
将其作为字符映射中的第一个字符,可以使用两个编码0011
加上两个无关紧要的位。