为什么 Apache Commons Base32 在这里解码 return 任何空数组?

Why does the Apache Commons Base32 decoding return any empty array here?

这可能是一个简单的答案,但我似乎无法理解。我正在尝试解码消息的 Base32 部分,但没有得到我期望从 Apache Commons 解码器获得的结果。

base32 = new Base32(true);
byte[] value = base32.decode(new String("F=======").getBytes());

值为空数组

您正在使用 Boolean 的构造函数,即使用 hex = true。 您的字符串没有十六进制值。 在第一行中,使用 Base32() 构造函数。

我想我一开始完全误解了你的问题。

Why does the Apache Commons Base32 decoding return any empty array here?

回答。不仅仅是 Apache Commons Base32 解码库,任何 well-written base32 解码算法都会 return 一个空值。为什么? base32 编码算法不可能生成字符串 "F=======" 作为编码结果。

下面通过一个解码字符串的例子来理解base32解码算法"F8======"。请注意,“=”不是真正的 base32 字符。它仅用于填充。所以这里实际编码的字符串是"F8".

如果你看Base32hex character map,F和8的十进制分别是15和8,用二进制分别表示为00001111和00001000。正如术语 Base32 所暗示的那样,它以一组 5 位 (32 = 2^5) 工作。因此,当以一组 5 位分组时,相同的二进制数分别表示为 01111 和 01000。根据算法,这些 5 位集被放在一起作为“01111 01000”或“0111101000”,没有空格。然后,这个数字被分成一组,每组 8 位,从左边开始,给出“01111010 00”。这里的第二个集合是一个不完整的集合,因为它没有所有 8 位,所以它被丢弃,留下值 01111010,当转换为十进制时给出 122。值 122 映射到 ascii 字符 'z'。所以解码"F8"的答案是"z".

现在,如果您在 "F=======" 的示例中应用此算法,如果您丢弃填充,则只是 "F",您将只得到一组“01111”,这是一个不完整的集合,因为它没有所有的 8 位。因此,结果是一个空值 return。