203 votes

Comment initialiser un tableau d'octets en Java?

Je dois stocker des valeurs constantes (UUID) sous forme de tableau d'octets en java, et je me demande quel serait le meilleur moyen d'initialiser ces tableaux statiques. C’est ce que je fais actuellement, mais j’ai l’impression qu’il doit y avoir un meilleur moyen.

 private static final byte[] CDRIVES = new byte[] { (byte)0xe0, 0x4f, (byte)0xd0,
    0x20, (byte)0xea, 0x3a, 0x69, 0x10, (byte)0xa2, (byte)0xd8, 0x08, 0x00, 0x2b,
    0x30, 0x30, (byte)0x9d };
private static final byte[] CMYDOCS = new byte[] { (byte)0xba, (byte)0x8a, 0x0d,
    0x45, 0x25, (byte)0xad, (byte)0xd0, 0x11, (byte)0x98, (byte)0xa8, 0x08, 0x00,
    0x36, 0x1b, 0x11, 0x03 };
private static final byte[] IEFRAME = new byte[] { (byte)0x80, 0x53, 0x1c,
    (byte)0x87, (byte)0xa0, 0x42, 0x69, 0x10, (byte)0xa2, (byte)0xea, 0x08,
    0x00, 0x2b, 0x30, 0x30, (byte)0x9d };
...
and so on
 

Y a-t-il quelque chose que je pourrais utiliser qui soit moins efficace, mais aurait l'air plus propre? par exemple:

 private static final byte[] CDRIVES =
    new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };
 

155voto

dystroy Points 145126

À l'aide d'une fonction de conversion d'un hexa de la chaîne d' byte[], vous pourriez faire

byte[] CDRIVES = hexStringToByteArray("e04fd020ea3a6910a2d808002b30309d");

Je vous suggérons d'utiliser la fonction définie par Dave L de Convertir une chaîne de caractères de la représentation d'un vidage hexadécimal à un tableau d'octets à l'aide de Java?

Je l'insère ici pour un maximum de lisibilité :

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

Si vous laissez CDRIVES static et final, la chute des performances n'est pas pertinent.

124voto

petmez Points 249
byte[] myvar = "Any String you want".getBytes();

38voto

stefan.schwetschke Points 5143

En Java 6, il existe une méthode qui fait exactement ce que vous voulez:

 private static final byte[] CDRIVES = javax.xml.bind.DatatypeConverter.parseHexBinary("e04fd020ea3a6910a2d808002b30309d")
 

Sinon, vous pouvez utiliser Google Guava :

 import com.google.common.io
private static final byte[] CDRIVES = BaseEncoding.base16().decode("e04fd020ea3a6910a2d808002b30309d");
 

La méthode de goyave est excessive, lorsque vous utilisez de petits tableaux. Mais Guava a aussi des versions qui peuvent analyser les flux d’entrée. C'est une fonctionnalité intéressante lorsque vous utilisez de grandes entrées hexadécimales.

7voto

Mangist Points 761

Vous pouvez utiliser la classe Java UUID pour stocker ces valeurs au lieu des tableaux d'octets:

 UUID

public UUID(long mostSigBits,
            long leastSigBits)
 

Construit un nouvel UUID en utilisant les données spécifiées. mostSigBits est utilisé pour les 64 bits les plus significatifs de l'UUID et lessSigBits devient les 64 bits les moins significatifs de l'UUID.

2voto

Amit Points 4452

En ce qui concerne un procédé de nettoyage est concerné, vous pouvez utiliser ByteArrayOutputStream objet...

ByteArrayOutputStream bObj = new ByteArrayOutputStream();
bObj.reset();

//écriture de toutes les valeurs de bObj un par un à l'aide de

bObj.write(byte value)

// lorsque vous avez terminé, vous pouvez obtenir le byte[] à l'aide de

CDRIVES = bObj.toByteArray();

//que vous pouvez répéter le même processus pour la CMYDOCS et IEFRAME ainsi,

REMARQUE C'est peut-être pas une solution efficace si vous avez vraiment petit tableau.

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