Ответ 1
Вы можете использовать ByteBuffer
для этого:
ByteBuffer buffer = ByteBuffer.wrap(myArray);
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian
int result = buffer.getShort();
См. также Преобразовать 4 байта в int.
Мне нужно преобразовать 2 байтовый массив (byte [2]) в целочисленное значение в java. Как я могу это сделать?
Вы можете использовать ByteBuffer
для этого:
ByteBuffer buffer = ByteBuffer.wrap(myArray);
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian
int result = buffer.getShort();
См. также Преобразовать 4 байта в int.
В Java байты подписываются, что означает, что значение байта может быть отрицательным, а когда это произойдет, исходное решение @MattBall не будет работать.
Например, если двоичная форма массива байтов выглядит так:
1000 1101 1000 1101
тогда myArray [0] равен 1000 1101
, а myArray [1] равен 1000 1101
, десятичное значение байта 1000 1101
равно -115
вместо 141 (= 2 ^ 7 + 2 ^ 3 + 2 ^ 2 + 2 ^ 0)
если мы используем
int result = (myArray[0] << 8) + myArray[1]
значение будет -16191
, которое НЕПРАВИЛЬНО.
Причина, по которой это неправильно, заключается в том, что, когда мы интерпретируем 2-байтовый массив в целое число, все байты unsigned, поэтому при переводе мы должны сопоставить подписанные байты с целым числом без знака:
((myArray[0] & 0xff) << 8) + (myArray[1] & 0xff)
результат 36237
, используйте калькулятор или ByteBuffer, чтобы проверить, правильно ли он (я сделал это и да, он правильно).
Ну, каждый байт является целым числом в диапазоне -128..127, поэтому вам нужен способ сопоставить пару целых чисел с одним целым числом. Есть много способов сделать это, в зависимости от того, что вы закодировали в паре байтов. Наиболее распространенным будет сохранение 16-разрядного целого числа со знаком в виде пары байтов. Преобразование этого значения в целое число зависит от того, сохраняете ли вы его в форме big-endian:
(byte_array[0]<<8) + (byte_array[1] & 0xff)
или немного endian:
(byte_array[1]<<8) + (byte_array[0] & 0xff)
Кроме того, если вы можете использовать библиотеку Guava:
Ints.fromByteArray(0, 0, myArray[1], myArray[0]);
Стоит отметить, так как многие проекты используют его в любом случае.
Просто выполните следующее:
return new BigInteger(byte[] yourByteArray).intValue();
Хорошо работает с преобразованиями команд Bluetooth и т.д. Не нужно беспокоиться о подписанном или беззнакомом преобразовании.