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

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


值是一个空数组

最佳答案

首先,我想我已经完全误解了你的问题。


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


回答。它不仅是Apache Commons Base32解码库,而且任何编写良好的base32解码算法都将返回一个空值。为什么?由于编码,base32编码算法不可能生成字符串“ F ========”。

让我们以解码字符串“ F8 =======”的示例来理解base32解码算法。请注意,“ =”不是真正的base32字符。它仅用于填充。因此,这里的实际编码字符串是“ F8”。

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

现在,如果您在“ F ========”的示例中应用此算法,那么如果您放弃填充,它就是“ F”,那么您将仅获得“ 01111”集,这是不完整的集,因为它没有t拥有所有的8位。因此,将返回一个空值。

10-07 22:26