3

给出 Python 中的这个例子

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KB===='
a = base64.b32decode(sample)
b = base64.b32encode(a)

为什么会这样

样品!= b?

但是哪里

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KBAAAA'

然后

样本 == b

4

2 回答 2

4

你得到的第一个样本是无效的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 位,因此它们是无用的,因此:无效...

于 2012-09-14T00:40:03.197 回答
1

首先,让我们明确一点:您的问题是关于 base32,而不是 base64。

您的原始样本有点太长了。最后有 4 个=填充,这意味着至少有 20 位填充。位数必须是 8 的倍数,所以它实际上是 24 位。base32 中的编码B1,这意味着设置了填充位之一。这违反了规范,该规范规定所有填充位都必须清晰。解码完全丢弃该位,并且编码产生正确的值A而不是B.

于 2012-09-14T01:58:23.010 回答