2010-08-18 22 views
41

Le compilateur semble être ok avec ce (valeurs hex chiffres uniquement):Syntaxe littérale Pour les tableaux byte [] utilisant la notation Hex ..?

byte[] rawbytes={0xa, 0x2, 0xf}; 

Mais pas:

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

Je reçois une « perte possible de précision trouvée: int requis: octet " Erreur? Qu'est-ce que je fais de mal - ou est-ce que les nombres hexadécimaux à un chiffre constituent un cas particulier?

Java 1.5.x.

Répondre

41

Comme l'autre a déjà répondu, octet est un type signé en Java. La plage est comprise entre -128 et 127 inclus. Donc 0xff est égal à -0x01. Vous pouvez utiliser 0xff au lieu de -0x01 si vous ajoutez un casting manuel:

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

byte est signé et 0xff = 255 est trop grand. La plage valide est (-128 .. 127).

code Exemple:

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" est un int littéral pour la valeur décimale 255, ce qui est représentable comme un octet.

Pour l'instant, vous aurez besoin de le jeter à un byte de dire au compilateur que vous voulez vraiment dire -1, comme ceci:

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

Il a été proposé d'ajouter un nouvel octet syntaxe littérale (ou yY suffixe) à Java 7. Ensuite, vous auriez pu écrire:

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

Toutefois, cette proposition n'a pas été inclus dans la « proposition omnibus pour l'amélioration littéraux intégrale, » de sorte que nous soyons coincés avec le casting pour toujours.

+7

Le suffixe 'de y' n'a pas à la version de Java 7. Veuillez supprimer cette partie afin qu'elle ne perturbe pas les lecteurs. – Natix

12

Il y a une possibilité de plus en déclarant une fonction d'assistance avec arguments variables. Cela peut être préférable si vous devez déclarer plusieurs tableaux d'octets.

code Exemple

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 
    } 
}