Wie konvertiere ich Byte [] in Byte [] und umgekehrt?


77

Wie konvertiere ich byte[]zu Byte[]und auch Byte[]zu byte[], wenn keine Bibliothek eines Drittanbieters verwendet wird?

Gibt es eine Möglichkeit, es schnell zu machen, wenn Sie nur die Standardbibliothek verwenden?


5
10 Fragen, EINE angenommen? Nicht gut
Alfabravo

Warum brauchst / hast du eine Byte[]? Scheint keine gute Idee zu sein ... entweder verwenden byte[]oder List<Byte>.
Dünen

Könnte nützlich sein, wenn die Werte null sein können, obwohl sie wahrscheinlich nicht sehr effizient sind (dh aufgrund aller Objektreferenzen Speicherplatzvorteile beim Speichern von Bytes verschwenden)?
DNA

Aber Sie können a nicht in a konvertieren Byte[], byte[]wenn Sie null Referenzen haben ...
Dunes

@ BalusC ok, 1 von 7. Habe mich nicht viel verbessert!
Alfabravo

Antworten:


53

ByteKlasse ist ein Wrapper für das Grundelement byte. Dies sollte die Arbeit erledigen:

byte[] bytes = new byte[10];
Byte[] byteObjects = new Byte[bytes.length];

int i=0;    
// Associating Byte array values with bytes. (byte[] to Byte[])
for(byte b: bytes)
   byteObjects[i++] = b;  // Autoboxing.

....

int j=0;
// Unboxing Byte values. (Byte[] to byte[])
for(Byte b: byteObjects)
    bytes[j++] = b.byteValue();

4
Würde auf jeden Fall empfehlen , Byte.valueOf(b)über new Byte(b). Ich wäre überrascht, wenn die Byte-Klasse nicht jeden einzelnen Wert für ein Byte zwischenspeichern würde.
Dünen

2
Ich glaube, dass es besser sein könnte, zu verwenden Byte.valueOf(byte). JavaDocs sagen, dass diese Methode im Allgemeinen dem Konstruktor vorgezogen werden sollte Byte(byte), da diese Methode wahrscheinlich eine deutlich bessere räumliche und zeitliche Leistung liefert, da alle Bytewerte zwischengespeichert werden.
Edwin Dalorzo

9
Mit Autoboxing können Sie einfach tunbyteObjects[i++] = b;
Code-Apprentice

4
Ich würde es verwenden, new Byte[bytes.length];anstatt new Byte[10];es vernünftig zu halten.
BalusC

2
@ Juvanis aha, ich sehe, dass Sie zwei "Zähler" in der for-Schleife verwenden: einen zum Iterieren über das primitive Bytearray und / oder das Byteobjektarray und einen anderen zum Inkrementieren des Index des primitiven Bytearrays und / oder Bytes Objektarray. Für mich ist das eine schlechte Praxis. Wenn dieser Code von anderen verwaltet wird und jemand den Zähler "i" von 0 auf einen anderen Wert ändert oder i ++ in ++ i ändert, stimmen die Indizes nicht mehr überein. Ich befürworte nicht, dass jemand den Code an erster Stelle ändern sollte, aber es ist eine häufige Gefahr für Anfänger. Mein Vorschlag hält die Indizes beider Arrays synchron.
user504342

61

Byte [] zu Byte []:

byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);

Byte [] zu Byte []:

Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);

1
Warum ist das nicht die beste Antwort? Irgendein Leistungsgrund oder nur später beantwortet?
Mvorisek

25
Weil die ArrayUtils nicht Teil von Java sind, sondern Apache lib.
Mvorisek

Ich stimme @mvorisek zu, dies sollte als die beste Antwort angesehen werden. Fügen
Sie

15

Sie können die toPrimitive-Methode in der ArrayUtils-Klasse der Apache Commons-Langbibliothek verwenden. Wie hier vorgeschlagen - Java - Byte [] bis Byte []


Dies ist tatsächlich die beste Antwort, zumindest für alle, für die das Hinzufügen einer Abhängigkeit zu commons-lang kein Problem darstellt.
ARRG

15

Java 8-Lösung:

Byte[] toObjects(byte[] bytesPrim) {
    Byte[] bytes = new Byte[bytesPrim.length];
    Arrays.setAll(bytes, n -> bytesPrim[n]);
    return bytes;
}

Leider können Sie dies nicht tun, um von Byte[]nach zu konvertieren byte[]. Arrayshat setAllfür double[],, int[]und long[], aber nicht für andere primitive Typen.


6
byte[] toPrimitives(Byte[] oBytes)
{

    byte[] bytes = new byte[oBytes.length];
    for(int i = 0; i < oBytes.length; i++){
        bytes[i] = oBytes[i];
    }
    return bytes;

}

Umgekehrt:

//byte[] to Byte[]
Byte[] toObjects(byte[] bytesPrim) {

    Byte[] bytes = new Byte[bytesPrim.length];
    int i = 0;
    for (byte b : bytesPrim) bytes[i++] = b; //Autoboxing
    return bytes;

}

5

Von Byte [] zu Byte []:

    byte[] b = new byte[]{1,2};
    Byte[] B = new Byte[b.length];
    for (int i = 0; i < b.length; i++)
    {
        B[i] = Byte.valueOf(b[i]);
    }

Von Byte [] zu Byte [] (unter Verwendung unserer zuvor definierten B):

    byte[] b2 = new byte[B.length];
    for (int i = 0; i < B.length; i++)
    {
        b2[i] = B[i];
    }

1

Wenn jemand die Stream-API gegenüber normalen Schleifen bevorzugt.

private Byte[] toObjects(byte[] bytes) {
    return IntStream.range(0, bytes.length)
            .mapToObj(i -> bytes[i])
            .toArray(Byte[]::new);
}

und umgekehrt?
ElectRocnic

Ich denke, Sie können kein Byte [] von Stream erhalten. Die Stream-API verfügt über die Methoden mapToInt (), mapToDouble () und mapToLong (), jedoch nicht über mapToByte ().
mkalmo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.