比较字节值?
我很想知道为什么,当我将一个byte
数组与一个值进行比较时……
boolean match = ((data[0] & 0xFF) == 0xFE);
…返回true
,而……
boolean match = (data[0] == 0xFE);
…才不是? data
是一个byte
数组
data[0] = (byte) 0xFE;
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;
是一个字节(所以它是有符号的 ),它的值是-2
。
-2
不等于254
,这就是为什么你必须将data [0]比作一个字节,或者在将它与整数0xFE
进行比较之前将其扩展为整数。
更简单的比较可能是
boolean match = (data[0] == (byte)0xFE);
我相信它与将0xFF提升为符号扩展的int有关。 在第一个表达式中,0xFE也被提升为int,因此data[0] & 0xFF
的结果也是一个int,并且完成了int比较。
但是在第二个代码示例中,没有进行任何操作,因此没有提升到int。 也就是说,数据[0]不会被提升为int,但0xFE是一个int。