когда нужно привести шестнадцатеричные литералы в java к (байту)? - PullRequest
4 голосов
/ 23 декабря 2011

В целях тестирования я попытался создать массив следующим образом:

byte[] expected = new byte[]{0x2f, 0x0d4, 0xe1, 0xc6, 0x7a, 0x2d, 0x28, 0xfc}

Я ожидал, что java будет жаловаться и попросит меня привести каждый литерал здесь к (байту), но неожиданно этопопросил меня только конвертировать 0x4d, например, но не 0x2f.Рабочий пример:

new byte[]{0x2f, (byte) 0xd4, (byte) 0xe1, (byte) 0xc6, 0x7a, 0x2d, 0x28, (byte) 0xfc}

Как это работает?

Ответы [ 3 ]

8 голосов
/ 23 декабря 2011

Я подозреваю, что это потому, что байт Java подписан, поэтому у вас есть диапазон между -128 и 127. Таким образом, все значения> 127 (0x80) должны быть явно преобразованы.

4 голосов
/ 23 декабря 2011

Числовой литерал без l, d или f является значением int, поэтому необходимо привести значения 0x80 и более. Один из способов охватить множество шестнадцатеричных значений - использовать следующее

byte[] bytes = new BigInteger("2fd4e1c67a2d28fc", 16).toByteArray();
System.out.println(Arrays.toString(bytes));

печать

[47, -44, -31, -58, 122, 45, 40, -4]

Это позволяет избежать некоторых утомительных , (byte) 0x между значениями.

2 голосов
/ 23 декабря 2011

Целочисленный литерал от -128 до 127 будет автоматически преобразован в целевой тип, а Java имеет только подписанные типы.

...