比较字节值?

时间:2012-11-15 06:05:33

标签: java comparison byte

当我将byte数组与值进行比较时,我很想知道原因...

boolean match = ((data[0] & 0xFF) == 0xFE);

...返回true,而......

boolean match = (data[0] == 0xFE);

......不是吗? data是一个带有

byte数组
data[0] = (byte) 0xFE;

2 个答案:

答案 0 :(得分:23)

boolean match = ((data[0] & 0xFF) == 0xFE);

比较整数,因为0xFF是一个整数,这个表达式会将你的字节 data[0]放大到一个int,并将括号内的内容与第二个int 0xFE(254)进行比较。正如您所说data[0](byte)0xFE,它将首先缩放为整数0xFE并与整数0xFE进行比较,因此可行。

boolean match = (data[0] == 0xFE);

将一个字节与int 0xFE254

进行比较
data[0] = (byte) 0xFE; 

是一个字节(因此它是signed),其值为-2

-2不等于254,因此您必须将数据[0]比较为一个字节,或者在将其与整数0xFE进行比较之前将其扩展为整数。

更简单的比较可能是

boolean match = (data[0] == (byte)0xFE);

答案 1 :(得分:3)

我认为它与将0xFF提升为带符号扩展名的int有关。在第一个表达式中,0xFE也被提升为int,因此data[0] & 0xFF的结果也是一个int,并且完成了int比较。

但是在第二个代码示例中,没有进行任何操作,因此没有提升到int。也就是说,数据[0]不会被提升为int,但0xFE是一个int。