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