2014-09-10 4 views
0

У меня есть строки, которые всегда шестнадцатеричные, такие как «FF», «BB», «AA» и т. Д. Я сделал небольшой эксперимент с кодировкой, и это выглядит так: hexadecimal is беря вдвое больше байтов, чем эти вещи в представлении String.Шестнадцатеричное представление занимает больше места, чем должно было

Мой код как это:

 String hex ="FF"; 

     byte[] b = hex.getBytes(); 
     String enc = base16().encode(hex.getBytes()); 
     byte[] c = enc.getBytes(); 

Я использую гуавы Utils сделать материал кодирования.

Похоже, что hex принимает два байта, поэтому b имеет длину 2. Затем я кодирую его в шестнадцатеричный. «FF» равен 255 в десятичной форме, поэтому ему необходимо принять 1 byte. Но enc теперь составляет 4 байта и равно "4646".

Далее, c - 4 байта.

Я не понимаю, где создается enc. Я хочу c взять 1 байт. Может кто-то бросить какой-то свет?

Спасибо!

ответ

2

getBytes() method не делает, что вы думаете. Он не анализирует его как шестнадцатеричное число; он дает кодировки символов. Символом F является номер 70, поэтому hex.getBytes() получает двухбайтовый массив 'F', 'F', или 70, 70.

Кодирует эту строку в последовательность байтов, используя кодировку по умолчанию платформы, сохраняя результат в новый массив байтов.

Чтобы разобрать его как шестнадцатеричное число, вы можете использовать Integer.parseInt с десятичной 16.

byte[] c = { (byte) Integer.parseInt(hex, 16) }; 

Integer.parseInt используются вместо Byte.parseByte потому FF слишком велико для знакового байта.

Выход:

[-1] 
+0

Это имеет смысл! Спасибо тонну –

1

Использование Integer.parseInt(hex,16) для преобразования шестнадцатеричной строки к междунар. Затем вы можете преобразовать его в байты.

Когда вы вызываете hex.getBytes(), вы получаете представление байта двух символов F в кодировке по умолчанию. Обычно для этого требуется, по меньшей мере, один байт на символ, и он не обрабатывает вашу строку "FF" как число hexadeciaml.

+0

Gotcha! Благодаря! –

Смежные вопросы