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