Как замаскировать значение байта в Java?

Моя проблема примерно такая.

У меня есть расчет в байтах на Java. В некоторых вычислениях я получаю желаемый результат «2a» в байтовом значении, но в некоторых вычислениях я получаю «ffffff9a» в байтовом значении. Я просто хочу получить значение "9a" из результата "ffffff9a". Я пробовал это, но не работал.

byte a = (byte) b & 0xff;

где b имеют значение "ffffff9a" байтовое значение.

Но при отображении тот же процесс работает как

System.out.println(Integer.toHexString(b & 0xff));

Где я ошибаюсь? Что я могу сделать, чтобы получить желаемое значение?

Спасибо


На самом деле я пытаюсь преобразовать 8-битный символ в 7-битный GSM. Кроме того, если кто-то может помочь мне в этом, это тоже будет полезно. Строка хранится в виде массива байтов, и мне нужно преобразовать эту строку или 8-битные байты в 7-битные.


person bunkdeath    schedule 14.07.2011    source источник
comment
Ваш код выглядит хорошо для меня, дважды проверьте, правильно ли вы его тестируете? Может, показать всю рутину? Также является ли «b» типом байта?   -  person fileoffset    schedule 14.07.2011
comment
Мне кажется, все нормально System.out.println(Integer.toHexString(0xffffff9a & 0xff)); печатает 9a ideone.com/ikxuO   -  person Bala R    schedule 14.07.2011
comment
да b - это тип байта, и печать в порядке, я хочу сохранить значение в переменной, где проблема   -  person bunkdeath    schedule 14.07.2011


Ответы (2)


Тип byte в Java подписан. Он имеет диапазон [-128, 127].

System.out.println(Integer.toHexString(a & 0xff)); // note a, not b

Покажет "правильное значение", хотя a, имеющее тип byte, будет содержать отрицательное значение ((byte)0x92). То есть (int)a == 0x92 будет ложным, потому что приведение к int сохраняет значение, отрицательное и все такое, а (a & 0xff) == 0x92 будет истинным. Это связано с тем, что побитовое & продвигает выражение к типу int, «маскируя» «знаковый бит» (на самом деле не знаковый бит, а артефакт дополнения до двух).

См.: Как "скрыть" байты в Java

Удачного кодирования.

person Community    schedule 14.07.2011

Ваш исходный код был: byte a = (byte) b & 0xff;

Приведение типа (byte) применялось только к b, который уже является byte. Затем оператор & расширил его до int, так что вы получили результат "ffffff9a" из int.

Вы должны убедиться, что приведение типов применяется к результату &, а не только к его первому операнду:

byte a = (byte)(b & 0xff);

Обратите внимание на лишнюю пару скобок.

person rossum    schedule 14.07.2011
comment
Я тоже пробовал это (лишняя скобка), но результат тот же. - person bunkdeath; 14.07.2011