52 votes

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

Le compilateur semble s'en accommoder (valeurs hexagonales à un seul chiffre uniquement) :

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

Mais pas ça :

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

Je reçois une erreur "Possible Loss of Precision found : int required : byte" ?

Qu'est-ce que je fais de travers - ou les numéros hexagonaux à un seul chiffre sont-ils un cas particulier ?

Java 1.5.x.

55voto

Hendrik Brummermann Points 4543

Comme l'autre réponse l'a déjà dit, l'octet est un type signé en Java. L'intervalle est de -128 à 127 inclus. Donc 0xff est égal à -0x01. Vous pouvez utiliser 0xff au lieu de -0x01 si vous ajoutez un cast manuel :

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

14voto

Eero Aaltonen Points 590

Il existe une autre possibilité en déclarant une fonction d'aide avec l'option arguments variables . Cela peut être préférable si vous devez déclarer plusieurs tableaux d'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
    }
}

9voto

erickson Points 127945

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

Pour l'instant, vous devez l'intégrer à un fichier de type 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 de littéral d'octet ( y o Y suffixe) à Java 7. Alors vous auriez été capable d'écrire :

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

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

8voto

Andreas_D Points 64111

byte est signé et 0xff = 255 est trop grande. 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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X