我有一个字节数组,我需要遍历并基于字节值做一些事情。以下是我的代码。
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应该在0x20
和0xFE
之间,但它不会进入任何范围。
我跟着this answer来比较字节。我无法弄清楚代码中出了什么问题。
提前致谢!
答案 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,表示您的有符号值转换为无符号值。