У меня есть два байтовых массива, и мне интересно, как я буду добавлять один к другому или комбинировать их для формирования нового байтового массива.
Как объединить два байтовых массива
Ответ 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;
}