当我将byte
数组与值进行比较时,我很想知道原因...
boolean match = ((data[0] & 0xFF) == 0xFE);
...返回true
,而......
boolean match = (data[0] == 0xFE);
......不是吗? data
是一个带有
byte
数组
data[0] = (byte) 0xFE;
答案 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 0xFE
:254
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。