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

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

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

4b9b3361

Ответ 1

Вы просто пытаетесь объединить два 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();

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

Самый простой метод (встроенный, предполагая, что a и b - два заданных массива):

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