Шестнадцатеричная строка в двоичную в Java - PullRequest
0 голосов
/ 23 мая 2018

Я делаю шифровальный шифр, который требует прочитать шестнадцатеричный ключ из файла и преобразовать его в массив bytes[].

Единственный способ сделать это, как я выяснил, это прочитать строки из файла (с помощью bufferedReader), создать из них массив шестнадцатеричных строк и преобразовать каждый элемент массива шестнадцатеричных строк в двоичную строку, которая можетпозже будет преобразован в байт с помощью parseByte.

Для большей ясности:

  • чтение строки
  • получение шестнадцатеричного массива
  • преобразование в двоичный файл
  • преобразование в байт)

Итак, в основном это выглядит так: hex[i] - это строка из шестнадцатеричного массива.

requiredByte[i] = Byte.parseByte(hexToBinary(hex[i]), 2);

Итак, чтобы мой метод работал, мне нужно прочитать шестнадцатеричный ключ из файла и преобразовать его в двоичные строки.

Ключ в шестнадцатеричном виде выглядит следующим образом (да, обе строки являютсято же самое):

01 23 45 67 89 AB CD EF

01 23 45 67 89 AB CD EF

Мне нужно преобразовать его в этотдвоичный ключ:

0000 0001 0010 0011 0100 0101 0110 0111

1000 1001 1010 1011 1100 1101 1110 1111

0000 0001 0010 0011 0100 0101 0110 0111

1000 1001 1010 1011 1100 1101 1110 1111

Однако пятое шестнадцатеричное число равно 89, что означает 137 как целое число.И вы можете преобразовывать числа только от -127 до 127 в двоичную строку.

Когда я пытаюсь преобразовать шестнадцатеричное число 89 по-своему, я получаю это сообщение в консоли:

Исключение в потоке "main" java.lang.NumberFormatException: значение вне диапазона.Значение: «100011» Корень: 16

У вас есть какие-нибудь идеи, как я могу преобразовать шестнадцатеричный в двоичный файл или даже как я могу преобразовать шестнадцатеричный String[] массив в byte[] массив?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я рекомендую вам использовать довольно простой метод BigInteger::toString(int radix), который возвращает строковое представление в данном основании.Используйте 2 для двоичного представления.

// 100100011010001010110011110001001101010111100110111101111
new BigInteger("0123456789ABCDEF", 16).toString(2);

Обратите внимание, что строка не должна содержать пустых символов, и таким образом вы должны обрабатывать их из массива по одному.

0 голосов
/ 23 мая 2018

Вместо анализа с использованием Byte.parseByte используется больший тип, например Integer.Integer.parseInt будет работать нормально, и вы можете просто привести результат к байту, если это то, что вам нужно.

Но помните, что печать этого байта покажет вам отрицательное число.Если вы хотите увидеть его как беззнаковое значение, сделайте побитовое и с 0xff, например:

byte b = 0xff;
System.out.println(b & 0xff); //Will print 255 instead of -1
...