В Java нет такой вещи как неподписанный байт.
Работая с некоторым кодом низкого уровня, иногда вам нужно работать с байтами, у которых значения без знака больше 128, что заставляет Java интерпретировать их как отрицательное число из-за того, что MSB используется для знака.
Какой хороший способ обойти это? (Сказать не использовать Java не вариант)
При чтении любого отдельного значения из массива скопируйте его в что-то вроде short или целого числа и вручную конвертируйте отрицательное число в положительное значение, которое должно быть.
byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
Вы можете сделать аналогичное преобразование при записи в массив.
Я думаю, вы могли бы просто использовать шорт для их хранения. Не очень эффективный, но на самом деле единственный вариант, кроме некоторых грубых усилий, которые я видел.
Вероятно, вам лучше всего использовать целое число, а не байт. В нем есть место для чисел, превышающих 128, без необходимости создавать специальный объект для замены байта.
Это также предлагают люди умнее меня (всех)
Лучший способ сделать биты манипуляции / неподписанные байты - использовать int s. Несмотря на то, что они подписаны, у них есть много свободных битов (всего 32), которые можно рассматривать как неподписанный байт. Кроме того, все математические операторы преобразуют меньшие числа с фиксированной точностью в int . Пример:
short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short
Из-за этого лучше всего придерживаться целого числа и маскировать его, чтобы получить интересующие вас биты. Пример:
int a = 32;
int b = 128;
int foo = (a + b) | 255;
Вот еще немного информации о примитивных типах Java: http://mindprod.com/jgloss/primitive.html
Последнее тривиальное примечание: в Java есть одно число без знака с фиксированной точностью. Это символ примитива.
Использование ints обычно лучше, чем использование шорт, потому что в любом случае java использует 32-битные значения внутри себя (даже для байтов, если не в массиве), поэтому использование ints позволит избежать ненужного преобразования в / из коротких значений в байт-коде.
byte
более понятно и лучше передает смысл кода, поэтому я бы использовал его для удобства чтения, даже если он использует то же пространство, что и int
. int
лучше byte
подходит для ваших целей, не поможет, если вам случится положиться на библиотеку, которая где- то использует (на ум приходит USB-стек на Android). На самом деле можно избавиться от оператора if и дополнения, если вы сделаете это следующим образом.
byte[] foobar = ..;
int value = (foobar[10] & 0xff);
Таким образом, Java не интерпретирует байт как отрицательное число и также переворачивает бит знака на целое число.
Я знаю, что это очень поздний ответ, но я наткнулся на эту тему, пытаясь сделать то же самое. Проблема заключается в том, чтобы просто определить, является ли байт Java> 127.
Простое решение:
if((val & (byte)0x80) != 0) { ... }
Если реальная проблема составляет> 128, просто добавьте еще одно условие к этому оператору if.