Каков простой способ объединения двух byte
массивов?
Сказать,
byte a[];
byte b[];
Как объединить два byte
массива и сохранить его в другом byte
массиве?
java
arrays
concatenation
androidGuy
источник
источник
System.arrayCopy
,ByteBuffer
и тому - не так эффективно , но читаемым -ByteArrayOutputStream
все были охвачены. У нас есть более 7 вариантов ответов, приведенных здесь. Пожалуйста, не размещайте больше дупов.Ответы:
Самое простое:
источник
Самый элегантный способ сделать это с
ByteArrayOutputStream
.источник
outputStream.write( c );
- вам не нужно возвращаться и редактировать строку, где вы создаете результирующий байтовый массив. Кроме того, переупорядочение массивов просто, в отличие от использования метода arraycopy.a.length + b.length
качестве аргумента дляByteArrayOutputStream
конструктора. Обратите внимание, что этот метод все равно будет копировать все байты в новый массив для назначенияc[]
! РассмотримByteBuffer
метод близкого соперника, который не тратит память.Вот хорошее решение с использованием гуавы «s
com.google.common.primitives.Bytes
:Самое замечательное в этом методе то, что он имеет подпись varargs:
Это означает, что вы можете объединить произвольное количество массивов за один вызов метода.
источник
Другая возможность использования
java.nio.ByteBuffer
.Что-то вроде
Обратите внимание, что массив должен иметь соответствующий размер, чтобы начать с него, поэтому требуется линия выделения (так как
array()
просто возвращается вспомогательный массив, без учета смещения, положения или предела).источник
ByteBuffer.allocate(int)
является статическим методом, который возвращает экземплярjava.nio.HeapByteBuffer
классаByteBuffer
..put()
И.compact()
методы - и любые другие абстрактно-Несс - позаботятся.compact()
строка, так как она неверна.bb.flip(); bb.get(result);
вместоbyte[] result = bb.array();
линии.allocate
метода показывает следующее: «Позиция нового буфера будет нулевой, его предел будет его емкостью, его метка будет неопределенной, а каждый из его элементов будет инициализирован нулем. У него будет резервный массив, а смещение его массива будет равно нулю. " Так что для этого конкретного фрагмента кода, гдеByteBuffer
он размещен внутри, это не проблема.Другой способ - использовать служебную функцию (вы можете сделать это статическим методом универсального служебного класса, если хотите):
Вызовите так:
Он также будет работать для объединения 3, 4, 5 массивов и т. Д.
Делая это таким образом, вы получаете преимущество быстрого кода копирования массива, который также очень легко читать и поддерживать.
источник
источник
Если вы предпочитаете
ByteBuffer
как @kalefranz, всегда есть возможность объединить дваbyte[]
(или даже больше) в одну строку, например так:источник
Вы можете использовать сторонние библиотеки для чистого кода, такие как Apache Commons Lang, и использовать их следующим образом:
источник
ArrayUtils.addAll(a, b)
иbyte[] c = Bytes.concat(a, b)
, но последний быстрее.Для двух или нескольких массивов можно использовать этот простой и чистый служебный метод:
источник
Объединить два байтовых массива PDF
Если вы объединяете два байтовых массива, которые содержат PDF, эта логика не будет работать. Нам нужно использовать сторонний инструмент, такой как PDFbox от Apache:
источник
Если вы не хотите связываться с размерами массивов, просто используйте магию конкатенации строк:
Или определите где-нибудь в своем коде
и использовать
Это, конечно, также работает с более чем двумя конкатенациями строк с использованием
+
оператора сложения.И то
"l1"
и другоеISO_8859_1
указывает на набор символов западной латиницы 1, который кодирует каждый символ в виде одного байта. Поскольку многобайтовые переводы не выполняются, символы в строке будут иметь те же значения, что и байты (за исключением того, что они всегда будут интерпретироваться как положительные значения, какchar
без знака). Поэтому, по крайней мере, для предоставляемой Oracle среды выполнения любой байт будет правильно «декодирован», а затем снова «закодирован».Помните, что строки действительно расширяют байтовый массив, требуя дополнительной памяти. Струны также могут быть интернированы и поэтому не легко удаляются. Строки также являются неизменяемыми, поэтому значения внутри них не могут быть уничтожены. Поэтому не следует объединять чувствительные массивы таким образом и не следует использовать этот метод для больших байтовых массивов. Также потребуется четкое указание на то, что вы делаете, так как этот метод объединения массивов не является распространенным решением.
источник
Это мой способ сделать это!
Особенности :
...
) для вызова с любым числом байтов [].System.arraycopy()
это реализовано с машинным родным кодом, чтобы обеспечить высокую скорость работы.int
переменных за счет повторного использованияi
иlen
переменные.Имейте в виду :
Лучший способ сделать это - скопировать код @Jonathan . Проблема связана с массивами собственных переменных, потому что Java создает новые переменные, когда этот тип данных передается другой функции.
источник