Ответ 1
Попробуйте: int val = ((b[i] & 0xff) << 8) | (b[i + 1] & 0xff)
. Байты (к сожалению) подписаны на Java, поэтому, если высокий бит установлен, он получает расширение знака при преобразовании в целое число.
У меня есть несколько двоичных операций, которые не работают, как я ожидаю. У меня есть массив байтов с первыми двумя байтами, имеющими следующие значения: 0x5 и 0xE0. Я хочу объединить их в целочисленное значение, которое должно быть 0x5E0. Я пробовал:
int val = (b[i]) << 8 | b[i+1];
но значение выходит 0xFFFFFFEE0, и первый байт 0x5 теряется
Я думал, что это будет легко? Что я делаю неправильно?
Попробуйте: int val = ((b[i] & 0xff) << 8) | (b[i + 1] & 0xff)
. Байты (к сожалению) подписаны на Java, поэтому, если высокий бит установлен, он получает расширение знака при преобразовании в целое число.
Проблема заключается в том, что тип данных 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;
}