Qual é a maneira mais fácil de concatenar duas byte
matrizes?
Dizer,
byte a[];
byte b[];
Como concatenar duas byte
matrizes e armazená-las em outra byte
matriz?
java
arrays
concatenation
androidGuy
fonte
fonte
System.arrayCopy
,ByteBuffer
e a - não tão eficiente, mas legível -ByteArrayOutputStream
foram todos cobertos. Temos mais de 7 enganos das respostas dadas aqui. Por favor, não poste mais bobagens.Respostas:
Mais simples:
fonte
A maneira mais elegante de fazer isso é com a
ByteArrayOutputStream
.fonte
outputStream.write( c );
- você não precisa voltar e editar a linha em que cria a matriz de bytes resultante. Além disso, reordenar as matrizes é simples, ao contrário do método arraycopy.a.length + b.length
como argumento oByteArrayOutputStream
construtor. Observe que esse método ainda copiará todos os bytes para uma nova matriz à qual atribuirc[]
! Considere oByteBuffer
método como um concorrente próximo, que não desperdiça memória.Aqui está uma boa solução usando goiaba 's
com.google.common.primitives.Bytes
:O melhor deste método é que ele possui uma assinatura varargs:
o que significa que você pode concatenar um número arbitrário de matrizes em uma única chamada de método.
fonte
Outra possibilidade está usando
java.nio.ByteBuffer
.Algo como
Observe que a matriz deve ser dimensionada adequadamente para começar, portanto a linha de alocação é necessária (como
array()
simplesmente retorna a matriz de suporte, sem levar em consideração o deslocamento, a posição ou o limite).fonte
ByteBuffer.allocate(int)
é um método estático que retorna umajava.nio.HeapByteBuffer
subclasse instanciadaByteBuffer
. Os métodos.put()
e.compact()
- e qualquer outra abstração - são resolvidos.compact()
Linha removida por estar incorreta.bb.flip(); bb.get(result);
em vez dabyte[] result = bb.array();
linha.allocate
método revela o seguinte: "A posição do novo buffer será zero, seu limite será sua capacidade, sua marca será indefinida e cada um de seus elementos será inicializado como zero Ele terá uma matriz de apoio e seu deslocamento da matriz será zero. " Portanto, para este determinado pedaço de código, onde oByteBuffer
é alocada internamente, não é um problema.Outra maneira é usar uma função de utilitário (você pode fazer disso um método estático de uma classe de utilitário genérica, se quiser):
Invoque assim:
Também funcionará para concatenar 3, 4, 5 matrizes etc.
Fazer dessa maneira oferece a vantagem do código rápido de cópia de matriz, que também é muito fácil de ler e manter.
fonte
fonte
Se você preferir
ByteBuffer
como @kalefranz, sempre há a possibilidade de concatenar duasbyte[]
(ou até mais) em uma linha, assim:fonte
Você pode usar bibliotecas de terceiros para o Código Limpo como o Apache Commons Lang e usá-lo como:
fonte
ArrayUtils.addAll(a, b)
ebyte[] c = Bytes.concat(a, b)
, mas o último é mais rápido.Para duas ou várias matrizes, este método utilitário simples e limpo pode ser usado:
fonte
Mesclar duas matrizes de bytes em PDF
Se você estiver mesclando matrizes de dois bytes que contêm PDF, essa lógica não funcionará. Precisamos usar uma ferramenta de terceiros como o PDFbox do Apache:
fonte
Se você não quiser mexer no tamanho das matrizes, use a mágica da concatenação de strings:
Ou defina algum lugar no seu código
E use
Obviamente, isso também funciona com mais de duas concatenações de cadeias usando o
+
operador de adição.Ambos
"l1"
eISO_8859_1
indicam o conjunto de caracteres 1 em latim ocidental que codifica cada caractere como um único byte. Como nenhuma conversão de vários bytes é executada, os caracteres na sequência terão os mesmos valores que os bytes (exceto que eles sempre serão interpretados como valores positivos, comochar
não são assinados). Pelo menos para o tempo de execução fornecido pelo Oracle, qualquer byte será corretamente "decodificado" e depois "codificado" novamente.Cuidado que as strings expandem consideravelmente a matriz de bytes, exigindo memória adicional. As strings também podem ser internadas e, portanto, não serão fáceis de remover. As strings também são imutáveis, portanto, os valores dentro delas não podem ser destruídos. Portanto, você não deve concatenar matrizes confidenciais dessa maneira nem usar esse método para matrizes de bytes maiores. Também é necessário fornecer uma indicação clara do que você está fazendo, pois esse método de concatenação de matriz não é uma solução comum.
fonte
Esta é a minha maneira de fazê-lo!
Características :
...
) para ser chamado com qualquer número de bytes [].System.arraycopy()
implementado com código nativo específico da máquina, para garantir a operação em alta velocidade.int
variáveis, reutilizando as variáveisi
elen
.Tenha em mente :
A melhor maneira de fazer isso é copiando o código @Jonathan . O problema vem das matrizes de variáveis nativas, porque o Java cria novas variáveis quando esse tipo de dados é passado para outra função.
fonte