Ich muss einige konstante Werte (UUIDs) in Byte-Array-Form in Java speichern und frage mich, wie diese statischen Arrays am besten initialisiert werden können. So mache ich es derzeit, aber ich denke, es muss einen besseren Weg geben.
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
Gibt es etwas, das ich verwenden könnte, das vielleicht weniger effizient ist, aber sauberer aussehen würde? beispielsweise:
private static final byte[] CDRIVES =
new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };
"0000"
auf{0x30,0x30,0x30,0x30}
(ASCII) anstatt auf{0x00,0x00,0x00,0x00}
(binär), wie vom Poster gewünscht?In Java 6 gibt es eine Methode, die genau das tut, was Sie wollen:
Alternativ können Sie Google Guava verwenden :
Die Guava-Methode ist übertrieben, wenn Sie kleine Arrays verwenden. Guava hat aber auch Versionen, die Eingabestreams analysieren können. Dies ist eine nette Funktion, wenn es um große hexadezimale Eingaben geht.
quelle
base16().lowerCase().decode(...)
wenn Sie Hex-Ziffern in Kleinbuchstaben haben. docs.guava-libraries.googlecode.com/git/javadoc/com/google/…javax.xml.bind
wurde leider in Java 9 entfernt.Sie können die Java-UUID-Klasse verwenden, um diese Werte anstelle von Byte-Arrays zu speichern:
Erstellt eine neue UUID unter Verwendung der angegebenen Daten. mostSigBits wird für die höchstwertigen 64 Bit der UUID verwendet, und leastSigBits werden zu den niedrigstwertigen 64 Bit der UUID.
quelle
Für einen sauberen Prozess können Sie das ByteArrayOutputStream- Objekt verwenden ...
// schreibe alle Werte einzeln mit bObj
// Wenn Sie fertig sind, können Sie das Byte [] mit abrufen
// als Sie den ähnlichen Vorgang auch für CMYDOCS und IEFRAME wiederholen können,
HINWEIS Dies ist keine effiziente Lösung, wenn Sie wirklich ein kleines Array haben.
quelle
Eine Lösung ohne Bibliotheken, zurückgegebene dynamische Länge, vorzeichenlose Ganzzahlinterpretation (kein Zweierkomplement)
quelle
Unter diesen Umständen ist es meine bevorzugte Option,
org.apache.commons.codec.binary.Hex
nützliche APIs für die Konvertierung zwischenString
y hex und binär zu verwenden. Beispielsweise:Hex.decodeHex(char[] data)
Dies wirft ein,DecoderException
wenn das Array nicht hexadezimale Zeichen enthält oder wenn eine ungerade Anzahl von Zeichen vorhanden ist.Hex.encodeHex(byte[] data)
ist das Gegenstück zur obigen Decodierungsmethode und spuckt die auschar[]
.Hex.encodeHexString(byte[] data)
die von einembyte
Array zurück in ein konvertiertString
.Verwendung:
Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())
quelle
Sie können diese Dienstprogrammfunktion verwenden:
Im Gegensatz zu Varianten von Denys Séguret und stefan.schwetschke können Trennzeichen (Leerzeichen, Tabulatoren usw.) in die Eingabezeichenfolge eingefügt werden, um die Lesbarkeit zu verbessern.
Anwendungsbeispiel:
quelle
Der kleinste interne Typ, der zur Kompilierungszeit durch Hex-Zahlen zugewiesen werden kann, ist char , as
Um ein äquivalentes Byte-Array zu haben, kann man Konvertierungen als bereitstellen
quelle
und nach dem Zugriff in Byte konvertieren.
quelle