Je dois stocker des valeurs constantes (UUID) sous forme de tableau d'octets en java, et je me demande quelle serait la meilleure façon d'initialiser ces tableaux statiques. C'est comme ça que je le fais actuellement, mais je pense qu'il doit y avoir une meilleure façon.
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 serait moins efficace, mais qui aurait l'air plus propre? par exemple:
private static final byte[] CDRIVES =
new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };
"0000"
en{0x30,0x30,0x30,0x30}
(ASCII) plutôt qu'en{0x00,0x00,0x00,0x00}
(binaire) comme le souhaite l'affiche?Dans Java 6, il existe une méthode qui fait exactement ce que vous voulez:
Vous pouvez également utiliser Google Guava :
La méthode Guava est exagérée, lorsque vous utilisez de petits tableaux. Mais Guava a également des versions qui peuvent analyser les flux d'entrée. C'est une fonctionnalité intéressante lorsqu'il s'agit de grandes entrées hexadécimales.
la source
base16().lowerCase().decode(...)
si vous avez des chiffres hexadécimaux minuscules. docs.guava-libraries.googlecode.com/git/javadoc/com/google/…javax.xml.bind
a été malheureusement supprimé dans Java 9.Vous pouvez utiliser la classe Java UUID pour stocker ces valeurs, au lieu de tableaux d'octets:
Construit un nouvel UUID à l'aide des 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.
la source
En ce qui concerne un processus propre, vous pouvez utiliser l' objet ByteArrayOutputStream ...
// écrit toutes les valeurs dans bObj une par une en utilisant
// une fois terminé, vous pouvez obtenir l'octet [] en utilisant
// que vous pouvez également répéter le processus similaire pour CMYDOCS et IEFRAME,
REMARQUE Ce n'est pas une solution efficace si vous avez vraiment une petite baie.
la source
Une solution sans bibliothèques, longueur dynamique renvoyée, interprétation d'entiers non signés (pas de complément à deux)
la source
Mon option préférée dans ce cas est d'utiliser
org.apache.commons.codec.binary.Hex
des API utiles pour la conversion entreString
y hexadécimal et binaire. Par exemple:Hex.decodeHex(char[] data)
qui jette unDecoderException
s'il y a des caractères non hexadécimaux dans le tableau, ou s'il y a un nombre impair de caractères.Hex.encodeHex(byte[] data)
est l'équivalent de la méthode de décodage ci-dessus et crache le fichierchar[]
.Hex.encodeHexString(byte[] data)
qui convertit à nouveau d'unbyte
tableau en unString
.Usage:
Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())
la source
Vous pouvez utiliser cette fonction utilitaire:
Contrairement aux variantes de Denys Séguret et stefan.schwetschke, il permet d'insérer des symboles séparateurs (espaces, tabulations, etc.) dans la chaîne d'entrée, ce qui la rend plus lisible.
Exemple d'utilisation:
la source
Le plus petit type interne, qui au moment de la compilation peut être attribué par des nombres hexadécimaux est char , comme
Afin d'avoir un tableau d'octets équivalent, on peut déployer des conversions comme
la source
et après l'accès converti en octet.
la source