Quelle est la méthode la plus simple pour concaténer deux byte
tableaux?
Dire,
byte a[];
byte b[];
Comment concaténer deux byte
baies et les stocker dans une autre byte
baie?
java
arrays
concatenation
androidGuy
la source
la source
System.arrayCopy
,ByteBuffer
et - pas efficace mais lisible -ByteArrayOutputStream
ont tous été couverts. Nous avons plus de 7 dupes des réponses données ici. Merci de ne plus poster de dupes.Réponses:
Le plus simple:
la source
La façon la plus élégante de le faire est d'utiliser a
ByteArrayOutputStream
.la source
outputStream.write( c );
- vous n'avez pas besoin de revenir en arrière et de modifier la ligne où vous créez le tableau d'octets de résultat. De plus, la réorganisation des tableaux est simple, contrairement à l'utilisation de la méthode arraycopy.a.length + b.length
comme argument pour leByteArrayOutputStream
constructeur. Notez que cette méthode copiera toujours tous les octets dans un nouveau tableau auquel les affecterc[]
! Considérez laByteBuffer
méthode comme un concurrent proche, qui ne perd pas de mémoire.Voici une solution agréable en utilisant goyave de
com.google.common.primitives.Bytes
:La grande chose à propos de cette méthode est qu'elle a une signature varargs:
ce qui signifie que vous pouvez concaténer un nombre arbitraire de tableaux dans un seul appel de méthode.
la source
Une autre possibilité utilise
java.nio.ByteBuffer
.Quelque chose comme
Notez que le tableau doit être correctement dimensionné pour commencer, de sorte que la ligne d'allocation est requise (comme
array()
renvoie simplement le tableau de support, sans tenir compte du décalage, de la position ou de la limite).la source
ByteBuffer.allocate(int)
est une méthode statique qui renvoie unejava.nio.HeapByteBuffer
sous-classe instanciée deByteBuffer
. Les méthodes.put()
et.compact()
- et tout autre caractère abstrait - sont prises en charge.compact()
Ligne supprimée car elle est incorrecte.bb.flip(); bb.get(result);
à la place de labyte[] result = bb.array();
ligne.allocate
méthode révèle ce qui suit: "La position du nouveau tampon sera zéro, sa limite sera sa capacité, sa marque sera indéfinie et chacun de ses éléments sera initialisé à zéro . Il aura un tableau de support et son décalage de tableau sera nul. " Donc , pour ce particulier morceau de code, oùByteBuffer
est affecté en interne, ce n'est pas un problème.Une autre façon est d'utiliser une fonction utilitaire (vous pouvez en faire une méthode statique d'une classe utilitaire générique si vous le souhaitez):
Invoquez ainsi:
Il fonctionnera également pour concaténer 3, 4, 5 tableaux, etc.
Le faire de cette façon vous donne l'avantage d'un code de tableau rapide qui est également très facile à lire et à entretenir.
la source
la source
Si vous préférez
ByteBuffer
comme @kalefranz, il y a toujours la possibilité de concaténer deuxbyte[]
(voire plus) sur une même ligne, comme ceci:la source
Vous pouvez utiliser des bibliothèques tierces pour Clean Code comme Apache Commons Lang et l'utiliser comme:
la source
ArrayUtils.addAll(a, b)
etbyte[] c = Bytes.concat(a, b)
, mais ce dernier est plus rapide.Pour deux ou plusieurs tableaux, cette méthode utilitaire simple et propre peut être utilisée:
la source
Fusionner deux tableaux d'octets PDF
Si vous fusionnez deux tableaux d'octets contenant du PDF, cette logique ne fonctionnera pas. Nous devons utiliser un outil tiers comme PDFbox d'Apache:
la source
Si vous ne voulez pas jouer avec la taille des tableaux, utilisez simplement la magie de la concaténation de chaînes:
Ou définissez quelque part dans votre code
et utilise
Bien entendu, cela fonctionne également avec plus de deux concaténations de chaînes à l'aide de l'
+
opérateur d'addition.Les deux
"l1"
etISO_8859_1
indiquent le jeu de caractères Latin occidental 1 qui code chaque caractère sous la forme d'un octet unique. Comme aucune traduction multi-octets n'est effectuée, les caractères de la chaîne auront les mêmes valeurs que les octets (sauf qu'ils seront toujours interprétés comme des valeurs positives, carchar
non signés). Au moins pour le runtime fourni par Oracle, tout octet sera donc correctement «décodé» puis «encodé» à nouveau.Attention, les chaînes étendent considérablement le tableau d'octets, nécessitant de la mémoire supplémentaire. Les cordes peuvent également être internées et ne seront donc pas faciles à retirer. Les chaînes sont également immuables, de sorte que les valeurs qu'elles contiennent ne peuvent pas être détruites. Vous ne devez donc pas concaténer des tableaux sensibles de cette façon, ni utiliser cette méthode pour des tableaux d'octets plus grands. Il serait également nécessaire de donner une indication claire de ce que vous faites, car cette méthode de concaténation de tableau n'est pas une solution courante.
la source
C'est ma façon de le faire!
Caractéristiques :
...
) pour être appelé avec n'importe quel nombre d'octets [].System.arraycopy()
implémentée avec du code natif spécifique à la machine, pour garantir un fonctionnement à grande vitesse.int
variables en réutilisant les variablesi
etlen
.Gardez à l'esprit :
La meilleure façon de le faire est de copier le code @Jonathan . Le problème vient des tableaux de variables natifs, car Java crée de nouvelles variables lorsque ce type de données est transmis à une autre fonction.
la source