web-dev-qa-db-de.com

Wie initialisiere ich ein Byte-Array in Java?

Ich muss einige konstante Werte (UUIDs) in Byte-Array-Form in Java speichern, und ich frage mich, wie die statischen Arrays am besten initialisiert werden könnten. So mache ich es gerade, aber ich habe das Gefühl, dass es einen besseren Weg geben muss.

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 weniger effizient ist, aber sauberer aussehen würde?

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

Mit einer Funktion, die einen Hexa-String in byte[] konvertiert, können Sie dies tun 

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

Ich würde vorschlagen, dass Sie die von Dave L definierte Funktion in verwenden. Eine String-Darstellung eines Hex-Dumps in ein Byte-Array mit Java konvertieren?

Ich füge es hier für maximale Lesbarkeit ein:

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;
}

Wenn Sie CDRIVES static und final zulassen, ist der Leistungsabfall irrelevant. 

96
Denys Séguret
byte[] myvar = "Any String you want".getBytes();

String-Literale können mit einem Escape-Zeichen versehen werden, um ein beliebiges Zeichen bereitzustellen:

byte[] CDRIVES = "\u00e0\u004f\u00d0\u0020\u00ea\u003a\u0069\u0010\u00a2\u00d8\u0008\u0000\u002b\u0030\u0030\u009d".getBytes();
55
petmez

In Java 6 gibt es eine Methode, die genau das macht, was Sie wollen:

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

Alternativ können Sie Google Guava verwenden:

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

Die Guava-Methode ist übertrieben, wenn Sie kleine Arrays verwenden. Aber Guava hat auch Versionen, die Eingabeströme analysieren können. Dies ist eine nette Funktion, wenn Sie mit großen hexadezimalen Eingaben arbeiten.

30

Sie können die Java-UUID-Klasse verwenden, um diese Werte anstelle von Byte-Arrays zu speichern:

UUID

public UUID(long mostSigBits,
            long leastSigBits)

Erstellt eine neue UUID mit den angegebenen Daten. mostSigBits wird für die höchstwertigen 64 Bits der UUID verwendet und leastSigBits wird zu den niedrigsten 64 Bits der UUID. 

7
Mangist

Für einen sauberen Prozess können Sie ByteArrayOutputStream object ... verwenden. 

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

// schreibe alle Werte einzeln mit bObj 

bObj.write(byte value)

// Wenn Sie fertig sind, können Sie das Byte [] mit verwenden 

CDRIVES = bObj.toByteArray();

// dann können Sie den ähnlichen Vorgang auch für CMYDOCS und IEFRAME wiederholen.

NOTE Dies ist keine effiziente Lösung, wenn Sie wirklich ein kleines Array haben. 

2
Amit

Meine bevorzugte Option in diesem Fall ist die Verwendung von org.Apache.commons.codec.binary.Hex, die nützliche APIs für die Konvertierung zwischen Stringy hex und binär enthält. Zum Beispiel:

  1. Hex.decodeHex(char[] data), die eine DecoderException auslöst, wenn das Array nicht hexadezimale Zeichen enthält oder eine ungerade Anzahl von Zeichen vorhanden ist.

  2. Hex.encodeHex(byte[] data) ist das Gegenstück zur obigen Decodierungsmethode und spuckt den char[] aus.

  3. Hex.encodeHexString(byte[] data), die aus einem byte-Array in eine String zurück konvertiert.

Verwendung: Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())

1
rbrtl

Sie können diese Dienstprogrammfunktion verwenden:

public static byte[] fromHexString(String src) {
    byte[] biBytes = new BigInteger("10" + src.replaceAll("\\s", ""), 16).toByteArray();
    return Arrays.copyOfRange(biBytes, 1, biBytes.length);
}

Im Gegensatz zu den Varianten von Denys Séguret und stefan.schwetschke können hier Trennzeichen (Leerzeichen, Tabulatoren usw.) in die Eingabezeichenfolge eingefügt werden, um sie lesbarer zu machen.

Verwendungsbeispiel:

private static final byte[] CDRIVES
    = fromHexString("e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b 30 30 9d");
private static final byte[] CMYDOCS
    = fromHexString("BA8A0D4525ADD01198A80800361B1103");
private static final byte[] IEFRAME
    = fromHexString("80531c87 a0426910 a2ea0800 2b30309d");
0
John McClane

Eine Lösung ohne Bibliotheken, zurückgegebene dynamische Länge und Integer-Interpretation ohne Vorzeichen

    public static byte[] numToBytes(int num){
    if(num == 0){
        return new byte[]{};
    }else if(num < 256){
        return new byte[]{ (byte)(num) };
    }else if(num < 65536){
        return new byte[]{ (byte)(num >>> 8),(byte)num };
    }else if(num < 16777216){
        return new byte[]{ (byte)(num >>> 16),(byte)(num >>> 8),(byte)num };
    }else{ // up to 2,147,483,647
        return new byte[]{ (byte)(num >>> 24),(byte)(num >>> 16),(byte)(num >>> 8),(byte)num };
    }
}
0
ZMitton