如何组合两个字节数组

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

154561 次浏览

假设您的 byteData数组大于 32 + byteSalt.length()... 您将获得它的长度,而不是 byteSalt.length。您正在尝试从数组端复制。

你只是想连接两个 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();
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 ++)

可以通过使用 Apace 公共 lang 包(org.apache.commons.lang.ArrayUtils类)来实现这一点

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

我已经使用了这段代码,它工作得很好,只需要执行附加数据,或者传递一个带有数组的字节,或者两个数组来组合它们:

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

我认为这是最好的办法,

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

最简单的方法(假设 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;
}