Мне любопытно узнать, почему, когда я сравниваю массив byte со значением...
boolean match = ((data[0] & 0xFF) == 0xFE);
... возвращает true, а...
boolean match = (data[0] == 0xFE);
... нет? data - массив byte с
data[0] = (byte) 0xFE;
Ответ 1
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, поэтому вы должны сравнивать данные [0] в виде байта или масштабировать его до целого числа, прежде чем сравнивать его с целым числом 0xFE.
Более простым сравнением может быть
boolean match = (data[0] == (byte)0xFE);
Ответ 2
Я считаю, что это связано с продвижением 0xFF в int с расширением знака. В первом выражении 0xFE также продвигается к int, и поэтому результат data[0] & 0xFF также является int и выполняется сравнение int.
Но во втором примере кода операция не выполняется, и поэтому нет никакого продвижения к int. То есть, данные [0] не получают повышение до int, а 0xFE является int.