2012-11-15 19 views
20

Sono curioso di sapere il motivo per cui, quando ho confrontare una matrice byte con un valore ...Confronta i valori dei byte?

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

... restituisce true, mentre ...

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

... fa non? data è una matrice byte con

data[0] = (byte) 0xFE; 
+0

State ottenendo eventuali avvisi del compilatore? Penso che quelli potrebbero essere interi letterali (e quindi il confronto potrebbe essere fatto come int, con il numero negativo nella matrice e il letterale intero positivo). – Thilo

risposta

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

confronta interi come 0xFF è un numero intero, questa espressione scalerà il vostro bytedata[0] ad un int e confrontare ciò che è all'interno della parentesi per un secondo Int 0xFE(254). Come dici tu data[0] è (byte)0xFE, verrà prima ridimensionato al numero intero 0xFE e confrontato con il numero intero 0xFE, quindi questo funziona.

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

confronta un byte alla int 0xFE: 254

data[0] = (byte) 0xFE; 

è un byte (quindi è signed) e il suo valore è -2.

-2 non è uguale a 254, ecco perché è necessario confrontare i dati [0] come un byte o come scala fino a un intero prima che il confronto il numero intero 0xFE.

Un confronto più semplice potrebbe essere

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

Grazie mille! –

3

Credo che abbia a che fare con la promozione 0xFF ad un int con estensione del segno. Nella prima espressione, 0xFE è anche promosso a int e quindi il risultato di data[0] & 0xFF è anche un confronto int e un confronto int.

Ma nel secondo esempio di codice, non viene eseguita alcuna operazione e quindi non vi è alcuna promozione in int. Vale a dire, che i dati [0] non vengono promossi a int ma 0xFE è un int.