连接两个字节数组的简单方法

302

如何简单地连接两个 byte 数组?

比如说,

byte a[];
byte b[];

我如何将两个byte数组连接起来并存储到另一个byte数组中?


3
请注意,Apache Commons、Google的Guava、System.arrayCopyByteBuffer以及效率不高但易读的ByteArrayOutputStream都已经被涵盖在内。我们已经有超过7个重复的答案了,请不要再发布重复内容。 - Maarten Bodewes
13个回答

0

合并两个PDF字节数组

如果您要合并包含PDF的两个字节数组,则此逻辑将无法正常工作。我们需要使用第三方工具,如Apache的PDFbox:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
mergePdf.addSource(new ByteArrayInputStream(a));
mergePdf.addSource(new ByteArrayInputStream(b));
mergePdf.setDestinationStream(byteArrayOutputStream);
mergePdf.mergeDocuments();
c = byteArrayOutputStream.toByteArray();

有点偏离这个问题的主题,但正是我在寻找的。 - amos

0

如果您已经加载了Guava库,您可以使用com.google.common.primitives.Bytes中的静态方法concat(byte[]... arrays)

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

这里是“Kevin Bourrillion”编写的concat(byte[]... arrays)方法的独立源代码

public static byte[] concat(byte[]... arrays) {
    int length = 0;
    for (byte[] array : arrays) {
        length += array.length;
    }
    byte[] result = new byte[length];
    int pos = 0;
    for (byte[] array : arrays) {
        System.arraycopy(array, 0, result, pos, array.length);
        pos += array.length;
    }
    return result;
}

0

这是我的做法!

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

特点:

  • 使用可变参数(...),可以调用任意数量的byte[]。
  • 使用实现了机器特定本地代码的System.arraycopy(),确保高速操作。
  • 创建一个精确大小的新byte[]。
  • 通过重复使用ilen变量,分配少量的int变量。
  • 与常量进行更快的比较。

请记住:

更好的方法是复制@Jonathan code。问题来自于本地变量数组,因为当这种数据类型传递到另一个函数时,Java会创建新变量。


1
不,那是韦恩的做法,你晚了5年。 - Maarten Bodewes
@MaartenBodewes 感谢您,我使用了您的评论来进行编码练习,现在我的编码方式更加不同且性能更好。 - Daniel De León
1
我不确定这会有太大影响,因为数组大小在运行时也不会改变,但至少现在与其他解决方案不同了。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接