比较一个字节和十六进制

时间:2016-07-15 09:28:02

标签: java hex byte

我有一个字节数组,我需要遍历并基于字节值做一些事情。以下是我的代码。

    for (byte b:byteArray)
    {

        if(b>=(byte)0x00 && b<=(byte)0x1F)
        {
            //do something
        }
        else if(b>=(byte)0x20 && b <=(byte)0xFE)
        {   
             //do something
        }
        else if(b ==(byte)0xFF)
        {
            //do something
        }
    }

我的问题是字节比较没有按照我的期望发生。

假设我的字节数组中的值是{31, -117, 8, 0 , -1},我的代码无法检测各自范围内的所有负字节值。对于前者-117应该在0x200xFE之间,但它不会进入任何范围。

我跟着this answer来比较字节。我无法弄清楚代码中出了什么问题。

提前致谢!

2 个答案:

答案 0 :(得分:3)

你的关系只对无符号字节有意义 - 这在Java中是不存在的。

试试这个:

for (byte b:byteArray)
{
    int ib = b & 0xFF;         // This scales up to integer so you have values 0-255
    if(ib >=0x00 && ib<=0x1F)
    {
        //do something
    }
    else if(ib>=0x20 && ib <=0xFE)
    {   
         //do something
    }
    else if(ib == 0xFF)
    {
        //do something
    }
    else
    {
        // log a bug! This should never happen!
    }
}

在你的解决方案中-117是0x8B,实际上小于0x20(Dec 32),所以它不符合第二路径标准b >= 0x20。实际上,这会创建无法访问的代码,因为没有值是&gt; 32 &lt; = -2。

答案 1 :(得分:1)

Java中的字节默认是签名的。具有无符号字节的变通方法类似于:int num = (int) bite & 0xFF

如何运作,我们假设byte b = -128 ;,这表示为1000 0000

int num = (int)b; num现在为-128,二进制表示如下:

1111 1111 1111 1111 1111 1111 1000 0000

让我们在二进制文件中比较num & 0xFF吗?

1111 1111 1111 1111 1111 1111 1000 0000
&
0000 0000 0000 0000 0000 0000 1111 1111

结果为0000 0000 0000 0000 0000 0000 1000 0000,即128,表示您的有符号值转换为无符号值。