web-dev-qa-db-fra.com

Syntaxe littérale Pour les tableaux d'octets [] utilisant la notation hexadécimale ..?

Le compilateur semble être d'accord avec cela (valeurs hexadécimales à un chiffre uniquement):

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

Mais pas ça:

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

J'obtiens une erreur "Perte de précision possible trouvée: int requis: octet"?

Qu'est-ce que je fais mal - ou les nombres hexadécimaux à un chiffre sont-ils un cas spécial?

Java 1.5.x.

47
monojohnny

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

byte[] rawbytes={0xa, 0x2, (byte) 0xff};
47
Hendrik Brummermann

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

Exemple de code

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
    }
}
12
Eero Aaltonen

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

Exemple de code:

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
Andreas_D

"0xFF" est un littéral int pour la valeur décimale 255, qui n'est pas représentable comme un octet.

Pour l'instant, vous devrez le convertir en byte pour dire au compilateur que vous voulez vraiment dire -1, comme ceci:

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

Il a été proposé d'ajouter une nouvelle syntaxe littérale d'octet (suffixe y ou Y) à Java 7. Ensuite, vous auriez pu écrire:

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

Cependant, cette proposition n'a pas été incluse dans la "proposition omnibus pour des littéraux intégraux améliorés", donc nous sommes coincés avec le casting pour toujours.

8
erickson