Как замаскировать значение байта в Java? - PullRequest
1 голос
/ 14 июля 2011

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

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

byte a = (byte) b & 0xff;

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

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

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

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

Спасибо


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

Ответы [ 3 ]

7 голосов
/ 14 июля 2011

Тип 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 Как "скрыть" байты

Счастливого кодирования.

2 голосов
/ 14 июля 2011

Ваш первоначальный код: byte a = (byte) b & 0xff;

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

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

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

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

0 голосов
/ 09 марта 2016
//bit is zero base
public static boolean isSet(byte value, int bit)
{
    int b = (int)value & 0xff;
    b >>= bit;
    b &= 0x01;
    if( b != 0 )
    {
        return true;
    }
    return false;
}
public static byte setBit(byte value, int bit)
{
    int b = (int)value;

    b |= (1 << bit);
    return (byte)(b & 0xff);
}
public static byte clearBit(byte value, int bit)
{
    int b = (int)value;

    b &= ~(1 << bit);
    return (byte)(b & 0xff);
}
...