2010-08-18 6 views

risposta

41

Come già detto, il byte è un tipo firmato in Java. L'intervallo va da -128 a 127 inclusi. Quindi 0xff è uguale a -0x01. È possibile utilizzare 0xff invece di -0x01 se si aggiunge un cast manuale:

byte[] rawbytes={0xa, 0x2, (byte) 0xff}; 
7

byte è firmato e 0xff = 255 è troppo grande. L'intervallo valido è (-128 .. 127).

codice Esempio:

public static void main(String[] args) { 
    byte b = (byte) 0xff; // = -1 
    int i = b;    // = -1 
    int j = b & 0xff;  // = 255 

    System.out.printf("b=%s, i=%s, j=%s", b,i,j); 
} 
8

"0xFF" è un int letterale per il valore decimale 255, che non è rappresentabile come un byte.

Per il momento, è necessario lanciare ad un byte per dire al compilatore che realmente dire -1, in questo modo:

byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF }; 

E 'stato proposto di aggiungere una sintassi letterale nuovo byte (y o Y suffisso) per Java 7. Poi si sarebbe potuto scrivere:

byte[] rawbytes = { 0xA, 0x2, 0xFFy }; 

Tuttavia, questa proposta non è stata inclusa nella "proposta omnibus per una migliore letterali integrale", in modo che essere bloccato con il cast per sempre.

+7

Il suffisso 'y' non ce l'ha fatta per il rilascio di Java 7. Si prega di rimuovere quella parte in modo tale da non confondere i lettori. – Natix

12

C'è ancora una possibilità dichiarando una funzione di supporto con argomenti variabili. Questo potrebbe essere preferibile se è necessario dichiarare più array di byte.

codice di esempio

public static byte[] toBytes(int... ints) { // helper function 
    byte[] result = new byte[ints.length]; 
    for (int i = 0; i < ints.length; i++) { 
     result[i] = (byte) ints[i]; 
    } 
    return result; 
} 

public static void main(String... args) { 

    byte[] rawbytes = toBytes(0xff, 0xfe); // using the helper 

    for (int i = 0; i < rawbytes.length; i++) { 
     System.out.println(rawbytes[i]); // show it works 
    } 
}