Подтвердить что ты не робот

Скопируйте несколько байтовых массивов в один большой массив байтов

У меня есть один большой массив byte[] и множество небольших массивов byte (длина большого массива - это сумма длин небольших массивов). Может быть, есть какой-то быстрый способ скопировать один массив в другой от начальной позиции до конца, а не использовать для цикла для каждого байта вручную?

4b9b3361

Ответ 1

Вы можете использовать ByteBuffer.

ByteBuffer target = ByteBuffer.wrap(bigByteArray);
target.put(small1);
target.put(small2);
...;

Ответ 2

Используйте System.arraycopy().

Вы также можете применить решение из предыдущего моего ответа. Обратите внимание, что для примитивных типов, таких как byte, вам придется создавать отдельные версии (по одному для каждого примитивного типа), поскольку дженерики там не работают.

Ответ 3

Или вы можете использовать ByteArrayOutputStream (Хотя он создает результирующий массив для вас, а не копирует в существующий массив, как вы просили).

public byte[] concatenateByteArrays(List<byte[]> blocks) {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    for (byte[] b : blocks) {
        os.write(b, 0, b.length);
    }
    return os.toByteArray();
}

Ответ 4

Пример реализации

public static void copySmallArraysToBigArray(final byte[][] smallArrays,
    final byte[] bigArray){
    int currentOffset = 0;
    for(final byte[] currentArray : smallArrays){
        System.arraycopy(
            currentArray, 0,
            bigArray, currentOffset,
            currentArray.length
        );
        currentOffset += currentArray.length;
    }
}

Тестовый код

public static void main(final String[] args){
    final byte[][] smallArrays =
        {
           "The"    .getBytes(),
           " Quick" .getBytes(),
           " Brown" .getBytes(),
           " Fox"   .getBytes()
        };
    final byte[] bigArray = "The Small Mauve Cat".getBytes();
    copySmallArraysToBigArray(smallArrays, bigArray);
    System.out.println(new String(bigArray));
}

Вывод:

Быстрая коричневая лисица

Ответ 5

Вот еще одно решение, которое также использует ByteBuffer:

public static byte[] toByteArray(List<byte[]> bytesList)
{
    int size = 0;

    for (byte[] bytes : bytesList)
    {
        size += bytes.length;
    }

    ByteBuffer byteBuffer = ByteBuffer.allocate(size);

    for (byte[] bytes : bytesList)
    {
        byteBuffer.put(bytes);
    }

    return byteBuffer.array();
}