考虑下面这个Python示例:
sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KB===='
a = base64.b32decode(sample)
b = base64.b32encode(a)
为什么
sample != b
?但是在哪里呢?sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KBAAAA'
然后
样例等于b
你得到的第一个样本无效的base64编码。
摘自维基百科:
当要编码的字节数不是3的倍数(也就是说,如果最后一个块只有一个或两个字节的输入),则执行以下操作:添加值为零的额外字节,使其成为三个字节,并执行转换为base64。如果只有一个有效的输入字节,则选择前两个base64数字,如果有两个有效的输入字节,则选择前三个base64数字。可能会添加“=”字符以使最后一个块包含四个base64字符。
http://en.wikipedia.org/wiki/Base64#Examples
编辑:
摘自RFC 4648:
如果编码数据的末尾可用位数少于24位,则执行特殊处理。在数量的末尾始终完成完整的编码量。当输入组中可用的输入位少于24位时,会添加值为零的位(在右侧)以形成6位组的整数个数。使用“=”字符对数据进行填充。
你的示例
末尾的4个8位(即“=”)比24个位更多,因此它们是不必要的。(不确定示例
的数据类型,但请查明并将其大小乘以字符数除以24)
关于你的特定示例
:
base-encoding 读取24位的块,并且只需要在基础字符串结尾处添加 '=' 填充字符,以使将其分成24位块后剩余的任何内容都可以“大小为24”,因此可以被解码器解析。由于字符串末尾的 ===='s 超过了24位,它们是无用的,因此:无效...
首先,让我们明确一点:您的问题是关于base32而不是base64。
您原始的示例有点太长了。末尾有4个=
填充,意味着至少有20位填充。位数必须是8的倍数,因此实际上是24位。在base32中,B
的编码为1
,这意味着其中一个填充位被设置了。这违反了规范,规定所有填充位都必须清除。解码会完全删除该位,而编码会产生正确的值A
而不是B
。