Appending a byte[] to the end of another byte[]

131,052

Solution 1

Using System.arraycopy(), something like the following should work:

// create a destination array that is the size of the two arrays
byte[] destination = new byte[ciphertext.length + mac.length];

// copy ciphertext into start of destination (from pos 0, copy ciphertext.length bytes)
System.arraycopy(ciphertext, 0, destination, 0, ciphertext.length);

// copy mac into end of destination (from pos ciphertext.length, copy mac.length bytes)
System.arraycopy(mac, 0, destination, ciphertext.length, mac.length);

Solution 2

Perhaps the easiest way:

ByteArrayOutputStream output = new ByteArrayOutputStream();

output.write(ciphertext);
output.write(mac);

byte[] out = output.toByteArray();

Solution 3

You need to declare out as a byte array with a length equal to the lengths of ciphertext and mac added together, and then copy ciphertext over the beginning of out and mac over the end, using arraycopy.

byte[] concatenateByteArrays(byte[] a, byte[] b) {
    byte[] result = new byte[a.length + b.length]; 
    System.arraycopy(a, 0, result, 0, a.length); 
    System.arraycopy(b, 0, result, a.length, b.length); 
    return result;
} 

Solution 4

The other provided solutions are great when you want to add only 2 byte arrays, but if you want to keep appending several byte[] chunks to make a single:

byte[] readBytes ; // Your byte array .... //for eg. readBytes = "TestBytes".getBytes();

ByteArrayBuffer mReadBuffer = new ByteArrayBuffer(0 ) ; // Instead of 0, if you know the count of expected number of bytes, nice to input here

mReadBuffer.append(readBytes, 0, readBytes.length); // this copies all bytes from readBytes byte array into mReadBuffer
// Any new entry of readBytes, you can just append here by repeating the same call.

// Finally, if you want the result into byte[] form:
byte[] result = mReadBuffer.buffer();

Solution 5

First you need to allocate an array of the combined length, then use arraycopy to fill it from both sources.

byte[] ciphertext = blah;
byte[] mac = blah;
byte[] out = new byte[ciphertext.length + mac.length];


System.arraycopy(ciphertext, 0, out, 0, ciphertext.length);
System.arraycopy(mac, 0, out, ciphertext.length, mac.length);
Share:
131,052
Mitch
Author by

Mitch

Updated on July 14, 2022

Comments

  • Mitch
    Mitch almost 2 years

    I have two byte[] arrays which are of unknown length and I simply want to append one to the end of the other, i.e.:

    byte[] ciphertext = blah;
    byte[] mac = blah;
    byte[] out = ciphertext + mac;
    

    I have tried using arraycopy() but can't seem to get it to work.

  • Mitch
    Mitch about 13 years
    Excellent! Thanks for the quick solution. Works like a charm and seems so simple now!
  • Sorter
    Sorter about 8 years
    I found this more useful.
  • pete
    pete almost 7 years
    Easiest and perhaps best supported as ByteArrayBuffer seems deprecated.
  • Shashwat
    Shashwat almost 7 years
    I believe it will create difficulties if we don't know the size of the final array in advance.
  • Kroderia
    Kroderia about 6 years
    Best answer. It ensures the capacity without calculate it yourself.
  • krock
    krock almost 5 years
    @Shashwat in this case, we already know the length of ciphertext and mac byte arrays. That means we know the length of the new byte array should be the combined length of the original 2 byte arrays.
  • TommyLeong
    TommyLeong over 2 years
    Life saving answer