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

Java 为什么Apache Commons Base32解码在这里返回任何空数组?,java,apache-commons,base32,Java,Apache Commons,Base32,这可能是一个简单的答案,但我似乎不明白。我试图解码消息的Base32部分,但没有得到Apache Commons解码器预期的结果 base32 = new Base32(true); byte[] value = base32.decode(new String("F=======").getBytes()); value是一个空数组您使用的是Boolean的构造函数,即use hex=true。 您的字符串没有十六进制值。 在第一行中,使用Base32构造函数。我想我一开始完全误解了你的问题

这可能是一个简单的答案,但我似乎不明白。我试图解码消息的Base32部分,但没有得到Apache Commons解码器预期的结果

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

value是一个空数组

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

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

为什么Apache Commons Base32解码返回任何空数组 这里

回答。它不仅是ApacheCommonsBase32解码库,而且任何编写良好的Base32解码算法都将返回空值。为什么?base32编码算法不可能作为编码的结果生成字符串F=============

让我们以解码字符串F8===为例来了解base32解码算法。请注意,=不是真正的base32字符。它只是用来填充的。所以这里的实际编码字符串是F8

如果您查看,F和8的十进制值分别为15和8,它们分别以二进制表示为00001111和000011000。正如术语Base32所暗示的,它在一组5位32=2^5中工作。因此,当分组在一组5位中时,相同的二进制数分别表示为01111和01000。根据该算法,这些5位集合以01111 01000或01111 01000的形式放置在一起,不带空格。然后,将该数字分组为8个比特的集合,每个比特从左侧开始,即011110100。这里第二个集合是一个不完整的集合,因为它没有全部8位,所以它被丢弃,留给我们的值是01111010,当转换为十进制时,得到122。值122映射到ascii字符“z”。所以解码F8的答案是z


现在,如果你在你的例子F====中应用这个算法,如果你放弃了填充,你只会得到01111的集合,这是一个不完整的集合,因为它没有所有的8位。因此,结果返回一个空值

该布尔值用于我正在使用的Base32hex字母表Triacontakaidecimal。它使用字节数组作为输入。你有一根绳子。使用F====.getByteYea。那里有打字错误。我会编辑。getBytes仍然解码为空数组。谢谢你的帮助。