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