Сведения о вопросе

Faridun

03:12, 27th August, 2020

Теги

java   byte   unsigned   signed    

Как лучше всего обойти тот факт, что все Java байт подписаны?

Просмотров: 438   Ответов: 7

В Java нет такого понятия, как беззнаковый байт.

Работая с некоторым низкоуровневым кодом, иногда вам нужно работать с байтами, которые имеют беззнаковые значения больше 128, что заставляет Java интерпретировать их как отрицательное число из-за того, что MSB используется для знака.

Какой хороший способ обойти это? (Говорить не использовать Java-это не вариант)



  Сведения об ответе

park

13:34, 29th August, 2020

На самом деле можно избавиться от оператора if и добавления, если вы сделаете это так.

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

Таким образом, Java не интерпретирует байт как отрицательное число и не переворачивает знаковый бит на целое число.


  Сведения об ответе

appple

04:32, 14th August, 2020

При чтении любого отдельного значения из массива скопируйте его во что-то вроде short или int и вручную преобразуйте отрицательное число в положительное значение, которым оно должно быть.

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

Аналогичное преобразование можно выполнить и при записи в массив.


  Сведения об ответе

LAST

06:50, 11th August, 2020

Использование ints обычно лучше, чем использование shorts, потому что java все равно использует 32-разрядные значения внутри (даже для байтов, если только в массиве), поэтому использование ints позволит избежать ненужного преобразования в/из коротких значений в байт-коде.


  Сведения об ответе

PHPH

21:36, 21st August, 2020

Я знаю, что это очень поздний ответ, но я наткнулся на эту нить, когда пытался сделать то же самое. Проблема просто пытается определить, является ли байт Java >127.

Простое решение заключается в следующем:

if((val & (byte)0x80) != 0) { ... }

Если реальная проблема - >128 вместо этого, просто добавьте еще одно условие к этому if-оператору.


  Сведения об ответе

SSESION

05:45, 2nd August, 2020

Лучший способ сделать битовую манипуляцию / беззнаковые байты - это использовать 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 есть одно беззнаковое фиксированное число точности. Это и есть примитив Хара.


  Сведения об ответе

FAriza

21:06, 1st October, 2020

Вероятно, вам лучше всего использовать целое число, а не байт. У него есть место, чтобы позволить числам больше 128 без накладных расходов, связанных с созданием специального объекта для замены байта.

Это также предлагают люди умнее меня (все)


  Сведения об ответе

ASER

18:56, 21st August, 2020

Я думаю, что вы могли бы просто использовать короткий, чтобы хранить их. Не очень эффективный, но действительно единственный вариант, кроме некоторых титанических усилий, которые я видел.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться