273 votes

Méthode simple pour concaténer deux tableaux d'octets

Quel est le moyen le plus simple de concaténer deux byte des tableaux ?

Dites,

byte a[];
byte b[];

Comment concaténer deux byte et le stocker dans un autre byte le réseau ?

3 votes

Notez s'il vous plaît que Apache Commons, Google's Guava, System.arrayCopy , ByteBuffer et le - pas si efficace mais lisible - ByteArrayOutputStream ont tous été couverts. Nous avons plus de 7 doublons des réponses données ici. S'il vous plaît, ne postez pas d'autres doublons.

435voto

Kevin Points 911

La façon la plus élégante de le faire est d'utiliser un fichier de type ByteArrayOutputStream .

byte a[];
byte b[];

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

byte c[] = outputStream.toByteArray( );

68 votes

@vipw La raison pour laquelle cela est élégant est que si/quand vous souhaitez concaténer un troisième tableau plus tard, vous ajoutez simplement la ligne 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.

2 votes

De plus, cette méthode est beaucoup plus simple lorsque l'on travaille avec des tableaux de plus de 2 octets.

3 votes

Le fait de gaspiller du processeur et de la mémoire dépend de la fréquence de l'opération. Si c'est un milliard de fois par seconde, il faut l'optimiser. Sinon, la lisibilité et la maintenabilité peuvent être les considérations gagnantes.

348voto

Jonathan Points 6714

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

78voto

Zoltán Points 2915

Voici une solution intéressante qui utilise Goyave 's com.google.common.primitives.Bytes :

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

L'avantage de cette méthode est qu'elle possède une signature varargs :

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

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

0 votes

C'est le moyen le plus simple. BTW, aucune différence si vous utilisez Groovy.

34voto

kalefranz Points 357

Une autre possibilité consiste à 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();

// or using method chaining:

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

Notez que le tableau doit avoir une taille appropriée pour commencer, donc la ligne d'allocation est nécessaire (comme array() renvoie simplement le tableau de support, sans prendre en compte le décalage, la position ou la limite).

3 votes

@click_whir Désolé mec, mais ReadTheDocs. ByteBuffer.allocate(int) est une méthode statique qui renvoie un fichier de type java.nio.HeapByteBuffer une sous-classe de ByteBuffer . Le site .put() y .compact() et tout autre caractère abstrait - est pris en charge.

0 votes

@kalefranz Supprimé compact() car elle est incorrecte.

1 votes

Faites attention lorsque vous utilisez la méthode array() du ByteBuffer - à moins que vous ne sachiez absolument ce que vous faites et que la maintenabilité ne soit pas un problème, il n'y a aucune garantie que la position zéro dans le bytebuffer corresponde toujours à l'index 0 du tableau d'octets. Voir aquí . Je résous ce problème en émettant bb.flip(); bb.get(result); à la place de la byte[] result = bb.array(); línea.

11voto

James.Xu Points 3320
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);

0 votes

Même réponse que le Accepté et désolé, 5 minutes de retard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X