2016-07-15 53 views
0

我有一个字节数组,我需要遍历并根据字节值做一些事情。以下是我的代码。比较一个字节和十六进制

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来比较字节。我无法弄清楚代码中的错误。

提前致谢!

+1

'(字节)0xFE'实际上是'-2' –

+2

字节是用Java签名的。因此,b <=(byte)0xFE'只有两个值:0xfe和0xff。 – EJP

+0

@EJP我应该如何改变我的逻辑来覆盖以下两个范围中的所有可能的字节:0x00-0x1f和0x20-0xFE。对不起,如果问题是非常基本的,但我一直无法弄清楚。 – Exception

回答

2

你的关系只对无符号字节有意义 - 这在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的(32月),所以它不符合第二个路径标准b >= 0x20。实际上,这会产生无法访问的代码,因为值大于32 < = -2。

+0

谢谢!有效 – Exception

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,这意味着你的符号值转换为无符号值。