我很想知道为什么,当我将byte
数组与值进行比较时......
boolean match = ((data[0] & 0xFF) == 0xFE);
...返回true
,而...
boolean match = (data[0] == 0xFE);
...才不是?data
是一个byte
数组
data[0] = (byte) 0xFE;
我很想知道为什么,当我将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。也就是说,data[0] 没有被提升为 int,但 0xFE 是一个 int。