В Java не существует такого понятия, как беззнаковый байт.
Работая с низкоуровневым кодом, иногда приходится работать с байтами, которые имеют беззнаковые значения больше 128, что заставляет Java интерпретировать их как отрицательное число из-за того, что MSB используется для знака.
Как это можно обойти? (Сказать "не используйте Java" - не вариант).
На самом деле возможно избавиться от, если заявление и дополнение, если Вы делаете это как это.
byte[] foobar = ..;
int value = (foobar[10] & 0xff);
Таким образом, Ява doesn' t интерпретируют байт как отрицательное число и щелкают знаком, обдумал целое число также.
При чтении любого отдельного значения из массива скопируйте его во что-то вроде short или int и вручную преобразуйте отрицательное число в положительное, каким оно должно быть.
byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
Аналогичное преобразование можно выполнить и при записи в массив.
Используя ints обычно лучше, чем использование шорт, потому что Ява использует 32-битные ценности внутренне так или иначе (Даже для байтов, если во множестве), настолько использующий ints избежит ненужного преобразования в короткие ценности в bytecode.
Лучший способ сделать побитовую обработку / неподписанные байты посредством использования интервал s. Даже при том, что они подписаны, у них есть много запасных битов (32 общих количества), чтобы рассматривать как неподписанный байт. Кроме того, все математические операторы преобразуют меньшие фиксированные числа точности в интервал . Пример:
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;
Вот является еще некоторая информация о Яве примитивными типами http://mindprod.com/jgloss/primitive.html
Одно последнее тривиальное примечание, на Яве есть одно неподписанное фиксированное число точности. Это случайная работа примитивно.
Вероятно, лучше всего использовать целое число, а не байт. Оно позволяет использовать числа больше 128 без необходимости создавать специальный объект для замены байта.
Это также предложено людьми умнее меня (всеми).
Я знаю, что это - очень последний ответ, но я столкнулся с этой нитью, пытаясь сделать ту же самую вещь. Проблема просто пытается определить, является ли Явский байт > 127.
Простое решение:
if((val & (byte)0x80) != 0) { ... }
Если реальная проблема - > 128 вместо этого, просто добавив другое условие к тому если-заявлению добьется цели.
Я думаю, что вы можете просто использовать короткое время для их хранения. Не очень эффективно, но это действительно единственный вариант, кроме некоторых геркулесовых усилий, которые я видел.