这可能是一个简单的答案,但我似乎无法弄明白。我正在尝试解码消息的Base32部分,但没有得到我期望从Apache Commons解码器获得的结果。
base32 = new Base32(true);
byte[] value = base32.decode(new String("F=======").getBytes());
值是一个空数组
答案 0 :(得分:1)
我认为我最初完全误解了你的问题。
为什么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位,给出“01111010 00”。这里第二组是一个不完整的集合,因为它没有全部8位所以它被丢弃,留下我们的值为01111010,当转换为十进制时给出122.值122映射到ascii字符'z'。所以解码“F8”的答案是“z”。
现在,如果您在“F =======”的示例中应用此算法,如果您丢弃填充,则只是“F”,您将只获得“01111”的设置,这是一个不完整的集合,因为它没有全部8位。因此,返回一个空值。
答案 1 :(得分:0)
您正在使用Boolean的构造函数,即使用hex = true。 您的字符串没有十六进制值。 在第一行中,使用Base32()构造函数。