如何在Java中屏蔽字节值?

时间:2011-07-14 03:50:42

标签: java byte masking bitwise-and

我的问题是这样的。

我在Java中用byte进行了一些计算。在某些计算中,我在字节值中得到了我想要的结果“2a”,但在某些计算中,我得到字节值为“ffffff9a”。我只想从结果“ffffff9a”中输入“9a”值。我尝试了这个但是没有用。

byte a = (byte) b & 0xff;

其中b的值为“ffffff9a”字节值。

但是显示相同的过程就像

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

我哪里错了?我能做些什么来获得我想要的价值?

由于


实际上我正在尝试将8位字符转换为gsm 7位。如果有人可以帮我解决这个问题,那也会有所帮助。字符串存储为字节数组,我必须将此字符串或8位字节转换为7位。

3 个答案:

答案 0 :(得分:7)

Java中的byte类型是签名。它的范围是[-128,127]。

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

即使a类型为byte包含负值(byte)0x92),也会显示“正确的值”。也就是说,(int)a == 0x92将为false,因为int 的强制转换值为,为负值,而且(a & 0xff) == 0x92为真。这是因为逐位&将表达式提升为int类型,同时“屏蔽掉”“符号位”(不是真正的符号位,而是两个补码的假象)。

请参阅:Java How To "Covert" Bytes

快乐的编码。

答案 1 :(得分:2)

您的初始代码为:byte a = (byte) b & 0xff;

(byte)类型转换仅适用于bbyte已经是&int运算符然后将其扩展为int,因此您从&获得了结果“ffffff9a”。

您需要确保类型转换适用于byte a = (byte)(b & 0xff);的结果,而不仅仅是第一个操作数:

{{1}}

注意额外的一对括号。

答案 2 :(得分:0)

//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);
}