Почему декодирование Apache Commons Base32 возвращает здесь любой пустой массив?

Это, вероятно, простой ответ, но я не могу понять это. Я пытаюсь декодировать разделы Base32 сообщения, но не получаю ожидаемых результатов от декодера Apache Commons.

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

значение является пустым массивом

2 ответа

Решение

Я думаю, что сначала я совершенно не понял ваш вопрос.

Почему декодирование Apache Commons Base32 возвращает здесь любой пустой массив?

Ответь Это не просто библиотека декодирования Apache Commons Base32, но любой хорошо написанный алгоритм декодирования base32 вернет пустое значение. Зачем? Алгоритм кодирования base32 просто не может сгенерировать строку "F=======" в результате кодирования.

Давайте разберем алгоритм декодирования base32 на примере декодированной строки "F8======". Обратите внимание, что "=" не является реальным символом 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'. Таким образом, ответ декодирования "F8" является "Z".

Теперь, если вы примените этот алгоритм в своем примере "F=======", который является просто "F", если вы отбросите заполнение, вы получите только набор "01111", который является неполным, потому что он не у меня есть все 8 бит. Таким образом, пустое значение возвращается в результате.

Вы используете конструктор Boolean, который говорит, что используется hex = true. Ваша строка не имеет шестнадцатеричных значений. В первой строке используйте конструктор Base32().

Другие вопросы по тегам