这可能是一个简单的答案,但我似乎无法弄清楚。我正在尝试解码消息的 Base32 部分,但没有从 Apache Commons 解码器中得到我期望的结果。
base32 = new Base32(true);
byte[] value = base32.decode(new String("F=======").getBytes());
value 是一个空数组
这可能是一个简单的答案,但我似乎无法弄清楚。我正在尝试解码消息的 Base32 部分,但没有从 Apache Commons 解码器中得到我期望的结果。
base32 = new Base32(true);
byte[] value = base32.decode(new String("F=======").getBytes());
value 是一个空数组
我想我一开始完全误解了你的问题。
为什么 Apache Commons Base32 解码在这里返回任何空数组?
回答。它不仅仅是 Apache Commons Base32 解码库,任何编写良好的 base32 解码算法都会返回一个空值。为什么?由于编码,base32 编码算法不可能生成字符串“F=======”。
让我们以解码字符串“F8======”为例来了解base32解码算法。请注意,“=”不是真正的 base32 字符。它仅用于填充。所以这里的实际编码字符串是“F8”。
如果查看Base32hex 字符映射,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”。
现在,如果您在“F=======”的示例中应用此算法,如果您丢弃填充,则它只是“F”,您将只得到一组“01111”,这是一个不完整的集合,因为它没有t 拥有所有 8 位。因此返回一个空值作为结果。
您正在使用 Boolean 的构造函数,即使用 hex = true。您的字符串没有十六进制值。在第一行,使用 Base32() 构造函数。