Moyen facile de concaténer des tableaux de deux octets

Quel est le moyen facile de concaténer deux tableaux byte?

Dites,

byte a[];
byte b[];

Comment concaténer deux tableaux byte et les stocker dans un autre tableau byte?

205
demandé sur Nilesh Rathod 2011-04-01 16:09:24

12 réponses

Le plus simple:

byte[] c = new byte[a.length + b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
272
répondu Jonathan 2011-04-01 12:12:23

La façon La plus élégante de le faire est avec un ByteArrayOutputStream.

byte a[];
byte b[];

ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
outputStream.write( a );
outputStream.write( b );

byte c[] = outputStream.toByteArray( );
299
répondu Kevin 2018-05-09 11:40:18

, Voici une belle solution à l'aide de Goyave's com.google.common.primitives.Bytes:

byte[] c = Bytes.concat(a, b);

La grande chose à propos de cette méthode est que sa signature est

public static byte[] concat(byte[]... arrays)

, ce qui signifie que vous pouvez concaténer un nombre arbitraire de tableaux dans un seul appel de méthode.

49
répondu Zoltán 2015-12-18 12:15:18

Une autre possibilité est d'utiliser java.nio.ByteBuffer.

Quelque Chose comme

ByteBuffer bb = ByteBuffer.allocate(a.length + b.length + c.length);
bb.put(a);
bb.put(b);
bb.put(c);
byte[] result = bb.array();

Notez que le tableau doit être correctement dimensionné pour commencer, donc la ligne d'allocation est requise (car array() renvoie simplement le tableau de sauvegarde, sans tenir compte du décalage, de la position ou de la limite).

25
répondu kalefranz 2014-09-23 14:33:13

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):

byte[] concat(byte[]...arrays)
{
    // Determine the length of the result array
    int totalLength = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        totalLength += arrays[i].length;
    }

    // create the result array
    byte[] result = new byte[totalLength];

    // copy the source arrays into the result array
    int currentIndex = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length);
        currentIndex += arrays[i].length;
    }

    return result;
}

Invoquer comme ceci:

byte[] a;
byte[] b;
byte[] result = concat(a, b);

Cela fonctionnera également pour concaténer des tableaux 3, 4, 5, etc.

Le faire de cette façon vous donne l'avantage du code arraycopy rapide qui est également très facile à lire et à maintenir.

12
répondu Wayne Uroda 2012-08-29 23:28:26
byte[] result = new byte[a.length + b.length];
// copy a to result
System.arraycopy(a, 0, result, 0, a.length);
// copy b to result
System.arraycopy(b, 0, result, a.length, b.length);
11
répondu James.Xu 2011-04-01 12:17:00

Deux appels System.arraycopy sont maigres et moyens, mais pas faciles à comprendre (plus difficile à comprendre en tant que réviseur de code, c'est-à-dire).

Une approche plus lisible en utilisant java.nio.ByteBuffer:

byte[] ab = ByteBuffer.wrap(new byte[a.length + b.length]).put(a).put(b).array();
10
répondu Pavel Repin 2016-08-26 17:01:14

Si vous préférez ByteBuffer comme @kalefranz, il y a toujours la possibilité de concaténer deux byte[] (ou même plus) dans une ligne, comme ceci:

byte[] c = ByteBuffer.allocate(a.length+b.length).put(a).put(b).array();
9
répondu ZEuS 2014-08-29 14:35:57

Vous pouvez utiliser des bibliothèques tierces pour du Code propre comme Apache Commons Lang et l'utiliser comme:

byte[] bytes = ArrayUtils.addAll(a, b);
8
répondu Tomasz Przybylski 2014-11-25 09:40:01

Pour deux ou plusieurs tableaux, cette méthode utilitaire simple et propre peut être utilisée:

/**
 * Append the given byte arrays to one big array
 *
 * @param arrays The arrays to append
 * @return The complete array containing the appended data
 */
public static final byte[] append(final byte[]... arrays) {
    final ByteArrayOutputStream out = new ByteArrayOutputStream();
    if (arrays != null) {
        for (final byte[] array : arrays) {
            if (array != null) {
                out.write(array, 0, array.length);
            }
        }
    }
    return out.toByteArray();
}
6
répondu Jeroen Meulemeester 2014-09-26 11:37:42

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:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
mergePdf.addSource(new ByteArrayInputStream(a));
mergePdf.addSource(new ByteArrayInputStream(b));
mergePdf.setDestinationStream(byteArrayOutputStream);
mergePdf.mergeDocuments();
c = byteArrayOutputStream.toByteArray();
1
répondu Bala Vignesh B 2016-04-13 23:36:18

C'est ma façon de le faire!

public static byte[] concatByteArrays(byte[]... inputs) {
    int i, len = 0;
    for (i = 0; i < inputs.length; i++) {
        len += inputs[i].length;
    }
    byte[] r = new byte[len];
    i = len = 0;
    for (i = 0; i < inputs.length; i++) {
        System.arraycopy(inputs[i], 0, r, len, inputs[i].length);
        len += inputs[i].length;
    }
    return r;
}

Caractéristiques:

  • utilisez varargs (...) pour être appelé avec n'importe quel nombre d'octets[].
  • Utilisez System.arraycopy() qui est implémenté avec du code natif spécifique à la machine, pour assurer un fonctionnement à grande vitesse.
  • créez un nouvel octet [] avec la taille exacte qui en a besoin.
  • allouez un peu moins de variables int en réutilisant les variables i et len.

Gardez à l'esprit:

La meilleure façon de faire ceci, est en copiant le code @Jonathan . Le problème provient des tableaux de variables natives, car Java crée de nouvelles variables lorsque ce type de données est passé à une autre fonction.

0
répondu Daniel De León 2018-10-07 17:54:01