Как объединить два байтовых массива


У меня есть два массива байтов, и мне интересно, как я буду добавлять один к другому или комбинировать их, чтобы сформировать новый массив байтов.

6 56

6 ответов:

вы просто пытаетесь объединить два байтовых массивов?

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

или вы можете использовать систему.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);

или вы могли бы просто использовать список, чтобы выполнить работу:

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

Вы можете сделать это с помощью пакета Apace common lang (org.apache.commons.lang.ArrayUtils класс ). Вам нужно сделать следующее

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

Я думаю, что это лучший подход,

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

предполагая, что byteData массив больше, чем 32 + byteSalt.length()...вы собираетесь это длина, а не byteSalt.length. Вы пытаетесь скопировать из-за конца массива.

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 ++)

я использовал этот код, который работает довольно хорошо просто сделать 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();
}