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?

user926958
quelle
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();
Juvanis
quelle
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);
LaCrampe
quelle
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 []

Giannis
quelle
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.

ajb
quelle
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;

}
Jacktrades
quelle
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];
    }
DNA
quelle
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);
}
mkalmo
quelle
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