¿Cuál es la forma fácil de concatenar dos byte
matrices?
Decir,
byte a[];
byte b[];
¿Cómo concateno dos byte
matrices y las almaceno en otra byte
matriz?
java
arrays
concatenation
androidGuy
fuente
fuente
System.arrayCopy
,ByteBuffer
y el - no es tan eficiente, pero legible -ByteArrayOutputStream
todos se han cubierto. Tenemos más de 7 engaños de las respuestas dadas aquí. Por favor, no publique más engaños.Respuestas:
Más directo:
fuente
La forma más elegante de hacer esto es con un
ByteArrayOutputStream
.fuente
outputStream.write( c );
; no tiene que volver atrás y editar la línea donde crea la matriz de bytes de resultado. Además, reordenar las matrices es simple, a diferencia del uso del método arraycopy.a.length + b.length
como argumento para elByteArrayOutputStream
constructor. Tenga en cuenta que este método todavía copiará todos los bytes a una nueva matriz para asignarlosc[]
. Considere elByteBuffer
método como un competidor cercano, que no desperdicie memoria.He aquí una buena solución usando la guayaba 's
com.google.common.primitives.Bytes
:Lo mejor de este método es que tiene una firma varargs:
lo que significa que puede concatenar un número arbitrario de matrices en una sola llamada de método.
fuente
Otra posibilidad es usar
java.nio.ByteBuffer
.Algo como
Tenga en cuenta que la matriz debe tener el tamaño adecuado para comenzar, por lo que se requiere la línea de asignación (ya que
array()
simplemente devuelve la matriz de respaldo, sin tener en cuenta el desplazamiento, la posición o el límite).fuente
ByteBuffer.allocate(int)
es un método estático que devuelve una instanciajava.nio.HeapByteBuffer
, una subclase deByteBuffer
. Se atiende a los métodos.put()
y.compact()
, y a cualquier otra abstracción.compact()
línea porque es incorrecta.bb.flip(); bb.get(result);
en lugar de labyte[] result = bb.array();
línea.allocate
método revela lo siguiente: "La posición del nuevo buffer será cero, su límite será su capacidad, su marca será indefinida y cada uno de sus elementos se inicializará a cero . Tendrá una matriz de respaldo y su compensación de matriz será cero ". Entonces, para este fragmento de código en particular , dondeByteBuffer
se asigna internamente, no es un problema.Otra forma es usar una función de utilidad (si lo desea, puede hacer que sea un método estático de una clase de utilidad genérica):
Invocar así:
También funcionará para concatenar 3, 4, 5 matrices, etc.
Hacerlo de esta manera le brinda la ventaja de un código de matriz rápida que también es muy fácil de leer y mantener.
fuente
fuente
Si prefiere
ByteBuffer
como @kalefranz, siempre existe la posibilidad de concatenar dosbyte[]
(o incluso más) en una línea, como esta:fuente
Puede usar bibliotecas de terceros para Clean Code como Apache Commons Lang y usarlo como:
fuente
ArrayUtils.addAll(a, b)
ybyte[] c = Bytes.concat(a, b)
, pero este último es más rápido.Para dos o múltiples matrices, se puede utilizar este método de utilidad simple y limpio:
fuente
Combinar dos conjuntos de bytes PDF
Si está fusionando dos conjuntos de bytes que contienen PDF, esta lógica no funcionará. Necesitamos usar una herramienta de terceros como PDFbox de Apache:
fuente
Si no desea meterse con los tamaños de las matrices, simplemente use la magia de la concatenación de cadenas:
O defina en algún lugar de su código
y use
Esto, por supuesto, también funciona con más de dos concatenaciones de cadenas usando el
+
operador de suma.Ambos
"l1"
eISO_8859_1
indican el conjunto de caracteres del latín occidental 1 que codifica cada carácter como un solo byte. Como no se realizan traducciones de varios bytes, los caracteres de la cadena tendrán los mismos valores que los bytes (excepto que siempre se interpretarán como valores positivos, yachar
que no están firmados). Al menos para el tiempo de ejecución proporcionado por Oracle, cualquier byte se "decodificará" correctamente y luego "codificará" nuevamente.Tenga en cuenta que las cadenas expanden la matriz de bytes con consideración, lo que requiere memoria adicional. Las cadenas también pueden ser internadas y, por lo tanto, no serán fáciles de eliminar. Las cadenas también son inmutables, por lo que los valores dentro de ellas no se pueden destruir. Por lo tanto, no debe concatenar matrices sensibles de esta manera ni utilizar este método para matrices de bytes más grandes. También sería necesario dar una indicación clara de lo que está haciendo, ya que este método de concatenación de matrices no es una solución común.
fuente
¡Esta es mi forma de hacerlo!
Caracteristicas :
...
) para ser llamado con cualquier número de byte [].System.arraycopy()
que se implementa con código nativo específico de la máquina, para garantizar un funcionamiento a alta velocidad.int
variables reutilizando las variablesi
ylen
.Tener en cuenta :
La mejor manera de hacer esto es copiando el código @Jonathan . El problema proviene de las matrices de variables nativas, porque Java crea nuevas variables cuando este tipo de datos se pasa a otra función.
fuente