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

голоса
53

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

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

Что такое хороший способ обойти это? (Высказывание не используют Java не вариант)

Задан 14/08/2008 в 15:14
источник пользователем
На других языках...                            


7 ответов

голоса
77

@pauldoo

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

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

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

Ответил 21/08/2008 d 02:17
источник пользователем

голоса
18

При чтении любого одного значения из массива скопировать его в нечто вроде короткого или ИНТ и вручную преобразовать отрицательное число в положительное значение должно быть.

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

Вы можете сделать подобное преобразование при записи в массив.

Ответил 14/08/2008 d 15:24
источник пользователем

голоса
1

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

Ответил 19/08/2008 d 09:03
источник пользователем

голоса
0

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

Самое простое решение:

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

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

Ответил 19/02/2011 d 00:33
источник пользователем

голоса
0

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

Ответил 19/08/2008 d 04:39
источник пользователем

голоса
0

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

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

Ответил 14/08/2008 d 15:22
источник пользователем

голоса
-1

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

Ответил 14/08/2008 d 15:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more