Вот как хранить и преобразовывать значение без знака в байтах:
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;