如何组合两个字节数组

时间:2011-04-16 00:01:24

标签: java

我有两个字节数组,我想知道如何将一个添加到另一个或将它们组合成一个新的字节数组。

7 个答案:

答案 0 :(得分:98)

您只是尝试连接两个byte数组?

byte[] one = getBytesForOne();
byte[] two = getBytesForTwo();
byte[] combined = new byte[one.length + two.length];

for (int i = 0; i < combined.length; ++i)
{
    combined[i] = i < one.length ? one[i] : two[i - one.length];
}

或者您可以使用System.arraycopy

byte[] one = getBytesForOne();
byte[] two = getBytesForTwo();
byte[] combined = new byte[one.length + two.length];

System.arraycopy(one,0,combined,0         ,one.length);
System.arraycopy(two,0,combined,one.length,two.length);

或者您可以使用List来完成工作:

byte[] one = getBytesForOne();
byte[] two = getBytesForTwo();

List<Byte> list = new ArrayList<Byte>(Arrays.<Byte>asList(one));
list.addAll(Arrays.<Byte>asList(two));

byte[] combined = list.toArray(new byte[list.size()]);

或者您只需使用ByteBuffer就可以添加许多数组。

byte[] allByteArray = new byte[one.length + two.length + three.length];

ByteBuffer buff = ByteBuffer.wrap(allByteArray);
buff.put(one);
buff.put(two);
buff.put(three);

byte[] combined = buff.array();

答案 1 :(得分:22)

您可以使用Apache common lang package(org.apache.commons.lang.ArrayUtils class)来完成此操作。您需要执行以下操作

byte[] concatBytes = ArrayUtils.addAll(one,two);

答案 2 :(得分:4)

我认为这是最好的方法,

public static byte[] addAll(final byte[] array1, byte[] array2) {
    byte[] joinedArray = Arrays.copyOf(array1, array1.length + array2.length);
    System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
    return joinedArray;
}

答案 3 :(得分:2)

假设您的byteData数组大于32 + byteSalt.length() ...那么你的长度就是byteSalt.length。你试图从数组末端复制。

答案 4 :(得分:2)

String temp = passwordSalt;
byte[] byteSalt = temp.getBytes();
int start = 32;
for (int i = 0; i < byteData.length; i ++)
{
    byteData[start + i] = byteSalt[i];
}

这里代码的问题在于,用于索引数组的变量i将越过byteSalt数组和byteData数组。因此,请确保byteData的大小至少为passwordSalt字符串的最大长度加上32.更正以下内容的更正方法是:

for (int i = 0; i < byteData.length; i ++)

使用:

for (int i = 0; i < byteSalt.length; i ++)

答案 5 :(得分:1)

我已经使用了这个代码,它只能运行appendData并传递一个带有数组的字节,或两个数组来组合它们:

protected byte[] appendData(byte firstObject,byte[] secondObject){
    byte[] byteArray= {firstObject};
    return appendData(byteArray,secondObject);
}

protected byte[] appendData(byte[] firstObject,byte secondByte){
    byte[] byteArray= {secondByte};
    return appendData(firstObject,byteArray);
}

protected byte[] appendData(byte[] firstObject,byte[] secondObject){
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
    try {
        if (firstObject!=null && firstObject.length!=0)
            outputStream.write(firstObject);
        if (secondObject!=null && secondObject.length!=0)   
            outputStream.write(secondObject);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return outputStream.toByteArray();
}

答案 6 :(得分:1)

最简单方法(内联,假设ab是两个给定的数组)

byte[] c = (new String(a, cch) + new String(b, cch)).getBytes(cch);

这当然可以用于两个以上的求和运算,并使用在代码中定义的串联字符集:

static final java.nio.charset.Charset cch = java.nio.charset.StandardCharsets.ISO_8859_1;

或者,以更简单的形式,没有此字符集:

byte[] c = (new String(a, "l1") + new String(b, "l1")).getBytes("l1");

但是您需要抑制不太可能引发的UnsupportedEncodingException


最快方法:

public static byte[] concat(byte[] a, byte[] b) {
    int lenA = a.length;
    int lenB = b.length;
    byte[] c = Arrays.copyOf(a, lenA + lenB);
    System.arraycopy(b, 0, c, lenA, lenB);
    return c;
}