Литеральный синтаксис Для массивов byte [] с использованием шестнадцатеричной записи ..? - PullRequest
45 голосов
/ 18 августа 2010

Компилятор вроде бы в порядке (только шестнадцатеричные значения из одной цифры):

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

Но не это:

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

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

Что я делаю не так - или однозначные шестнадцатеричные числа - особый случай?

Java 1.5.x.

Ответы [ 4 ]

46 голосов
/ 18 августа 2010

Как уже сказал другой ответ, байт является типом со знаком в Java.Диапазон составляет от -128 до 127 включительно.Так что 0xff равно -0x01.Вы можете использовать 0xff вместо -0x01, если добавляете приведение вручную:

byte[] rawbytes={0xa, 0x2, (byte) 0xff};
12 голосов
/ 16 июля 2012

Существует еще одна возможность, объявив вспомогательную функцию с переменными аргументами . Это может быть предпочтительным, если вам нужно объявить несколько байтовых массивов.

Пример кода

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
    }
}
8 голосов
/ 18 августа 2010

"0xFF" - это литерал int для десятичного значения 255, который не может быть представлен в виде байта.

На данный момент вам нужно привести его к byte, чтобы сообщить компилятору, что вы действительно имеете в виду -1, например:

byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF };

Было предложено добавить новый синтаксис байтового литерала (y или Y суффикс) к Java 7. Тогда вы могли бы написать:

byte[] rawbytes = { 0xA, 0x2, 0xFFy };

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

8 голосов
/ 18 августа 2010

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);
}
...