字节值和十六进制的比较

时间:2014-03-09 03:19:02

标签: java hex byte

比较一个字节的值时遇到了问题。 从理论上讲,以下代码段应该返回true,但它会返回false

public static void main(String [] args) {
    byte a = 3;
    if (MpegUtil.isSlice(a) == true) {
        System.out.print("Yes");
    }
    else System.out.print("No");
}

public static boolean isSlice(byte ID) {
    if (ID >= 1 && ID <= (byte) 0xaf) return true;
    else return false;
}

函数isSlice的作用是:接收一个字节,如果它在1和af(十六进制)之间,它将返回true,如果它不返回值为False。然而,不知怎的,它通过回答false到3来完成了我的测试。

有没有人知道为什么这个功能不起作用?

编辑: 感谢您删除'byte'强制转换的建议,它确实允许代码运行,但是一旦比较值高于或等于'0x80',结果就会变回错误的'false'。我知道这是因为Java认为要签名的字节(现在我真的很期待Java 8),但是有没有比将条件更改为“更清晰”的版本:

if (ID != 0 && ID >= (byte) 0xaf && ID <= (byte) 0x7f) return true

由于这种情况乍一看似乎没有逻辑,有没有更明显的方法来解决这个问题?

2 个答案:

答案 0 :(得分:4)

它不起作用,因为(byte) 0xAF不是您的想法。尝试打印以下内容,以便您明白:

    System.out.println(0xaf); // 175
    System.out.println((byte) 0xaf); // -81

为什么(byte) 0xAF为负?

打印此:

System.out.println(Byte.MAX_VALUE); // 127

一个字节的范围是[-128, 127](256个数字),因此如果您将175投射到byte,您将获得:

175 - 256 = -81

你也可以试试这个:

System.out.println((byte) 128); // -128
System.out.println((byte) -129); // 127
System.out.println((byte) 256); // 0

答案 1 :(得分:1)

字节用Java签名。将0xaf强制转换为字节会产生负数。 Java方法是进行int比较。只需删除字节转换,所有应该开始工作。

同样,如果您需要比较32位无符号数量,您或多或少地被迫使用long比较。

缺少无符号类型是Java更烦人(非)的功能之一。

相关问题