Литературный синтаксис Для байт [] массивов с использованием шестнадцатеричной нотации..?
Компилятор, похоже, согласен с этим (только однозначные шестнадцатеричные значения):
byte[] rawbytes={0xa, 0x2, 0xf};
Но не это:
byte[] rawbytes={0xa, 0x2, 0xff};
Я получаю сообщение об ошибке "Возможная потеря точности": ошибка int required: byte "
Что я делаю неправильно - или это одиночные цифры шестнадцатеричных чисел в специальном случае?
Java 1.5.x.
Ответы
Ответ 1
Как уже сказал другой ответ, байт является подписанным типом в Java. Диапазон от -128 до 127 включительно. Итак, 0xff равно -0x01. Вы можете использовать 0xff вместо -0x01, если вы добавите ручной режим:
byte[] rawbytes={0xa, 0x2, (byte) 0xff};
Ответ 2
Существует еще одна возможность, объявив вспомогательную функцию с аргументами переменных. Это может быть предпочтительнее, если вам нужно объявить массивы с несколькими байтами.
Пример кода
public static byte[] toBytes(int... ints) { // helper function
byte[] result = new byte[ints.length];
for (int i = 0; i < ints.length; i++) {
result[i] = (byte) ints[i];
}
return result;
}
public static void main(String... args) {
byte[] rawbytes = toBytes(0xff, 0xfe); // using the helper
for (int i = 0; i < rawbytes.length; i++) {
System.out.println(rawbytes[i]); // show it works
}
}
Ответ 3
byte
подписан и 0xff = 255
слишком большой. Допустимый диапазон (-128.. 127).
Пример кода:
public static void main(String[] args) {
byte b = (byte) 0xff; // = -1
int i = b; // = -1
int j = b & 0xff; // = 255
System.out.printf("b=%s, i=%s, j=%s", b,i,j);
}
Ответ 4
"0xFF" является литералом int
для десятичного значения 255, которое не представляется в виде байта.
Теперь вам нужно отдать его в byte
, чтобы сообщить компилятору, что вы действительно имеете в виду -1, например:
byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF };
Было предложено добавить новый синтаксис байтового литерала (y
или y
суффикс) в Java 7. Затем вы смогли написать:
byte[] rawbytes = { 0xA, 0x2, 0xFFy };
Однако это предложение не было включено в "омнибусное предложение для улучшения интегральных литералов", поэтому мы застряли на листе навсегда.