Java: попытка добавить байт больше 127 в ByteBuffer

Так что в моей программе я читаю файловую систему с помощью RandomAccessFile, а затем нахожу байт 1080 и возвращаю значение, которое в данном случае равно 239.

Теперь я использую ByteBuffer и хочу добавить это значение в ByteBuffer, но теперь по очевидным причинам оно становится -17, а не 239. Есть ли ЛЮБОЙ способ добавить это в массив ByteBuffer/byte, сохранив исходное значение? Я хочу в конечном итоге преобразовать его в шестнадцатеричное значение, поэтому я не хочу, чтобы значение менялось.

Не уверен, имеет ли это какой-то смысл, я понимаю, что в Java байт увеличивается только до 127? Любой способ добавить до 255?


person James Corin    schedule 05.12.2019    source источник
comment
Просто считайте его неподписанным при печати.   -  person Sotirios Delimanolis    schedule 05.12.2019
comment
В Java нет такого понятия, как байт больше 127. Они подписаны, поэтому их значения равны -128..127. Все, что вы видите здесь, это расширение знака.   -  person user207421    schedule 05.12.2019
comment
-17 и 239 имеют одинаковые биты, если вы поместите их в 8-битный байт. Это не должно вызывать проблем, хотя при печати это выглядит странно — один из способов избежать — напечатать byteValue & 0xff. Если в результате этого в вашем коде возникнут проблемы, опубликуйте минимально воспроизводимый пример вашего кода.   -  person Erwin Bolwidt    schedule 05.12.2019
comment
Также есть Byte.toUnsignedInt(someByte). Но String.format("%02x", (byte)-17) подойдет (ef).   -  person Joop Eggen    schedule 06.12.2019


Ответы (1)


Проблема в том, что сумма расширяет переданное 127 и устанавливает бит знака.

      byte a = 121;
      byte b = 110;

      byte c = (byte) (a + b);
      System.out.println(c + " " + (c & 0xFF));

      b = (byte) 255;

      c = (byte) (a + b);
      System.out.println(c + " " + (c & 0xFF) + " " + (byte) 376);



Отпечатки

      -25 231
      120 120 120


Если кто-то хочет суммировать несколько значений, где расширение знака может вызвать проблемы, лучше всего привести значения к более широкому типу (byte в int или int в long) и замаскировать расширение знака перед добавлением.

      byte a = 121; 
      b = (byte) 255;
      int d = a + (b & 0xFF);  // mask off sign with int mask.
      System.out.println(d);

      long e = 0;
      int v = -1;
      e = e + (v & 0xFFFF_FFFFL); // mask off sign with long mask
      System.out.println(e);

Отпечатки

      376
      4294967295
person WJS    schedule 06.12.2019