1

我的问题是这样的。

我在 Java 中有一些字节计算。在某些计算中,我得到了我想要的字节值结果“2a”,但在某些计算中,我得到了字节值中的“ffffff9a”。我只想要结果“ffffff9a”中的“9a”值。我试过这个但没有用。

byte a = (byte) b & 0xff;

其中 b 具有值“ffffff9a”字节值。

但是在显示相同的过程时,就像

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

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

谢谢


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

4

3 回答 3

8

byteJava 中的类型是有符号的。它的范围为 [-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 如何“隐藏”字节

快乐编码。

于 2011-07-14T03:59:59.983 回答
2

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

(byte)类型转换仅适用于已经bbyte. 然后&,操作员将其扩大到 an,int因此您从int.

您需要确保您的类型转换适用于 的结果&,而不仅仅是它的第一个操作数:

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

注意额外的一对括号。

于 2011-07-14T09:20:16.683 回答
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);
}
于 2016-03-09T03:22:06.447 回答