Преобразовать неподписанный байт в подписанный байт - PullRequest
9 голосов
/ 06 августа 2011

Существует ли простой и элегантный способ преобразования значения байта без знака в значение байта со знаком в java?Например, если все, что у меня есть, это значение целого числа 240 (в двоичном (24 бита + 11110000) = 32 бита), как я могу получить значение со знаком для этого целого числа?

Ответы [ 5 ]

25 голосов
/ 06 августа 2011

В Java все примитивные типы, кроме char, подписаны. Вы не можете иметь неподписанный байт. Единственное, что вы можете сделать, это привести неподписанный байт к int, чтобы вы могли прочитать его правильное значение:

int a = b & 0xff

Если вы хотите сохранить значение байта без знака в типе байта, вы, очевидно, можете, но каждый раз, когда вам нужно «обработать» его, просто не забывайте снова приводить его, как показано выше.

10 голосов
/ 06 августа 2011

Java не имеет значений без знака, кроме char.Рассмотрим этот фрагмент:

byte val = (byte)255;
System.out.println(String.valueOf(val));

Результат будет равен -1, потому что младшие 8 битов скопированы в байтовую переменную.

6 голосов
/ 06 августа 2011
public int getUnsignedByte(byte[] bytes, int offset) {
    return (bytes[offset] & 0xFF);
}

должен сделать работу.

4 голосов
/ 18 августа 2015

Вот как хранить и преобразовывать значение без знака в байтах:

byte b = (byte) 144; // binary value = 10010000

Если вы разыгрываете b на int, вот что происходит:

int i = b;
System.out.println("value: "+i);  
System.out.println("binary: " + Integer.toBinaryString(i));

Выход:

value: -112 <- Incorrect value
binary: 11111111111111111111111110010000 

Почему это происходит? Байты подписаны в Java, и b отрицателен, поэтому операция приведения заполняет результирующее значение int 1 слева. Подробнее о форматах данных Java .

Так как же нам вернуться от -112 к правильному значению 144? Нам нужна 32-битная битовая маска , которую мы можем создать с помощью int:

int mask = 0x000000FF; // This is often shortened to just 0xFF

Теперь мы можем использовать побитовый оператор &, чтобы "обнулить" самые левые 24 бита, оставив только наши оригинальные 8 бит.

int unsignedValue = b & mask; // value = 144

Наше первоначальное значение 144 было восстановлено и может быть безопасно возвращено обратно в байт:

byte original = (byte) unsignedValue;
2 голосов
/ 06 августа 2011

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

byte b = (byte) 240;

Однако, если вы хотите сохранить неподписанный байт, вам нужно разобраться с этим самостоятельно. (т.е. Java не поддерживает это, но вы можете сделать это)

Для таких операций, как +, -, *, <<, >>>, ==,! =, ~ Вам не нужно ничего менять, для таких операций, как <,> вам необходимо внести незначительные корректировки для таких операций, как /,% вам нужно использовать больший тип данных.

Распространенная альтернатива - использовать больший тип данных, например int, для хранения значений 0 - 255. В этом нет особых недостатков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...