Was ist der einfache Weg, um zwei byte
Arrays zu verketten ?
Sagen,
byte a[];
byte b[];
Wie verkette ich zwei byte
Arrays und speichere sie in einem anderen byte
Array?
java
arrays
concatenation
androidGuy
quelle
quelle
System.arrayCopy
,ByteBuffer
und die - nicht so effizient , aber lesbar -ByteArrayOutputStream
haben alle abgedeckt. Wir haben mehr als 7 Dupes der hier gegebenen Antworten. Bitte poste keine Dupes mehr.Antworten:
Am einfachsten:
quelle
Der eleganteste Weg, dies zu tun, ist mit einem
ByteArrayOutputStream
.quelle
outputStream.write( c );
- Sie müssen nicht zurückgehen und die Zeile bearbeiten, in der Sie das Ergebnisbyte-Array erstellen. Außerdem ist die Neuanordnung der Arrays im Gegensatz zur Arraycopy-Methode einfach.a.length + b.length
als Argument für denByteArrayOutputStream
Konstruktor verwenden. Beachten Sie, dass diese Methode weiterhin alle Bytes in ein neues Array kopiert, dem sie zugewiesen werden sollc[]
! Betrachten Sie dieByteBuffer
Methode als einen engen Konkurrenten, der keinen Speicher verschwendet.Hier ist eine schöne Lösung mit Guava ‚s
com.google.common.primitives.Bytes
:Das Tolle an dieser Methode ist, dass sie eine varargs-Signatur hat:
Dies bedeutet, dass Sie eine beliebige Anzahl von Arrays in einem einzigen Methodenaufruf verketten können.
quelle
Eine andere Möglichkeit ist die Verwendung
java.nio.ByteBuffer
.Etwas wie
Beachten Sie, dass das Array zunächst eine angemessene Größe haben muss, sodass die Zuordnungszeile erforderlich ist (da
array()
das Backing-Array einfach zurückgegeben wird, ohne den Versatz, die Position oder das Limit zu berücksichtigen).quelle
ByteBuffer.allocate(int)
ist eine statische Methode, die eine instanziiertejava.nio.HeapByteBuffer
Unterklasse von zurückgibtByteBuffer
. Für die.put()
und.compact()
Methoden - und jede andere Abstraktheit - wird gesorgt.compact()
Zeile entfernt , da sie falsch ist.bb.flip(); bb.get(result);
anstelle derbyte[] result = bb.array();
Zeile ausstelle .allocate
zeigt das sorgfältige Lesen der Methode Folgendes: "Die Position des neuen Puffers ist Null, seine Grenze ist seine Kapazität, seine Markierung ist undefiniert und jedes seiner Elemente wird auf Null initialisiert Es wird ein Hintergrundarray haben und sein Array-Offset wird Null sein. " Für diesen speziellen Code, bei dem der CodeByteBuffer
intern zugewiesen wird, ist dies kein Problem.Eine andere Möglichkeit ist die Verwendung einer Dienstprogrammfunktion (Sie können dies zu einer statischen Methode einer generischen Dienstprogrammklasse machen, wenn Sie möchten):
Rufen Sie so auf:
Es funktioniert auch zum Verketten von 3, 4, 5 Arrays usw.
Auf diese Weise erhalten Sie den Vorteil eines schnellen Arraycopy-Codes, der auch sehr einfach zu lesen und zu warten ist.
quelle
quelle
Wenn Sie
ByteBuffer
@kalefranz bevorzugen , besteht immer die Möglichkeit, zweibyte[]
(oder sogar mehr) in einer Zeile wie folgt zu verketten :quelle
Sie können Bibliotheken von Drittanbietern für Clean Code wie Apache Commons Lang verwenden und wie folgt verwenden:
quelle
ArrayUtils.addAll(a, b)
undbyte[] c = Bytes.concat(a, b)
, aber letzteres ist schneller.Für zwei oder mehrere Arrays kann diese einfache und saubere Dienstprogrammmethode verwendet werden:
quelle
Führen Sie zwei PDF-Byte-Arrays zusammen
Wenn Sie zwei Byte-Arrays zusammenführen, die PDF enthalten, funktioniert diese Logik nicht. Wir müssen ein Drittanbieter-Tool wie PDFbox von Apache verwenden:
quelle
Wenn Sie sich nicht mit den Größen von Arrays herumschlagen möchten, verwenden Sie einfach die Magie der Zeichenfolgenverkettung:
Oder definieren Sie irgendwo in Ihrem Code
und verwenden
Dies funktioniert natürlich auch mit mehr als zwei Zeichenfolgenverkettungen unter Verwendung des
+
Additionsoperators.Beide
"l1"
undISO_8859_1
geben den Western Latin 1-Zeichensatz an, der jedes Zeichen als einzelnes Byte codiert. Da keine Mehrbyte-Übersetzungen ausgeführt werden, haben die Zeichen in der Zeichenfolge dieselben Werte wie die Bytes (außer dass sie immer als positive Werte interpretiert werden, alschar
nicht signiert sind). Zumindest für die von Oracle bereitgestellte Laufzeit wird daher jedes Byte korrekt "decodiert" und dann erneut "codiert".Beachten Sie, dass Zeichenfolgen das Byte-Array erheblich erweitern und zusätzlichen Speicher benötigen. Saiten können auch interniert werden und lassen sich daher nicht leicht entfernen. Zeichenfolgen sind ebenfalls unveränderlich, sodass die darin enthaltenen Werte nicht zerstört werden können. Sie sollten daher vertrauliche Arrays nicht auf diese Weise verketten oder diese Methode für Arrays mit größeren Bytes verwenden. Es wäre auch erforderlich, einen klaren Hinweis darauf zu geben, was Sie tun, da diese Methode der Array-Verkettung keine übliche Lösung ist.
quelle
Das ist mein Weg, es zu tun!
Eigenschaften :
...
), um mit einer beliebigen Anzahl von Bytes [] aufgerufen zu werden.System.arraycopy()
diese Option mit maschinenspezifischem nativem Code, um einen Hochgeschwindigkeitsbetrieb sicherzustellen.int
Variablen zu, indem Sie die Variableni
und wiederverwendenlen
.Denken Sie daran :
Der bessere Weg, dies zu tun, ist das Kopieren des @ Jonathan-Codes . Das Problem tritt bei den nativen Variablenarrays auf, da Java neue Variablen erstellt, wenn dieser Datentyp an eine andere Funktion übergeben wird.
quelle