Подтвердить что ты не робот

Литературный синтаксис Для байт [] массивов с использованием шестнадцатеричной нотации..?

Компилятор, похоже, согласен с этим (только однозначные шестнадцатеричные значения):

byte[] rawbytes={0xa, 0x2, 0xf};

Но не это:

byte[] rawbytes={0xa, 0x2, 0xff};

Я получаю сообщение об ошибке "Возможная потеря точности": ошибка int required: byte "

Что я делаю неправильно - или это одиночные цифры шестнадцатеричных чисел в специальном случае?

Java 1.5.x.

4b9b3361

Ответ 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 };

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