Преобразование бит в целое число

У меня есть несколько двоичных операций, которые не работают, как я ожидаю. У меня есть массив байтов с первыми двумя байтами, имеющими следующие значения: 0x5 и 0xE0. Я хочу объединить их в целочисленное значение, которое должно быть 0x5E0. Я пробовал:

int val = (b[i]) << 8 | b[i+1];

но значение выходит 0xFFFFFFEE0, и первый байт 0x5 теряется

Я думал, что это будет легко? Что я делаю неправильно?

Ответы

Ответ 1

Попробуйте: int val = ((b[i] & 0xff) << 8) | (b[i + 1] & 0xff). Байты (к сожалению) подписаны на Java, поэтому, если высокий бит установлен, он получает расширение знака при преобразовании в целое число.

Ответ 2

Проблема заключается в том, что тип данных byte подписан. Следовательно, b[i+1] получает расширенный знак перед выполнением операции, становясь 0xFFFFFFE0. Когда он получает OR-ed с 0x0500 от b[i]<<8, 0x0500 теряется.

Вы можете исправить это с помощью команды "И" с помощью 0xFF перед выполнением операции:

public static int toInt16(byte high, byte low) {
    int res = (high << 8);
    res |= (low & 0xFF);
    return res & 0xFFFF;
}

Демоверсия