Esta é uma abordagem correta para converter ByteBuffer em String desta forma,
String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());
if(k.equals(v))
System.out.println("it worked");
else
System.out.println("did not work");
A razão de eu perguntar é que isso parece muito simples, enquanto outras abordagens como Java: Converter String de e para ByteBuffer e problemas associados parece mais complexo.
java
string
serialization
bytearray
vikky.rk
fonte
fonte
Respostas:
EDIT (2018): A resposta do irmão editada por @xinyongCheng é uma abordagem mais simples e deve ser a resposta aceita.
Sua abordagem seria razoável se você soubesse que os bytes estão no conjunto de caracteres padrão da plataforma. Em seu exemplo, isso é verdadeiro porque
k.getBytes()
retorna os bytes no conjunto de caracteres padrão da plataforma.Mais frequentemente, você desejará especificar a codificação. No entanto, há uma maneira mais simples de fazer isso do que a pergunta que você vinculou. A API String fornece métodos que convertem entre uma String e uma matriz de bytes [] em uma codificação específica. Esses métodos sugerem o uso de CharsetEncoder / CharsetDecoder "quando mais controle sobre o processo de decodificação [codificação] é necessário".
Para obter os bytes de uma String em uma codificação específica, você pode usar um método irmão getBytes ():
Para colocar bytes com uma codificação específica em uma String, você pode usar um construtor String diferente:
Observe que
ByteBuffer.array()
é uma operação opcional. Se você construiu seu ByteBuffer com um array, pode usar esse array diretamente. Caso contrário, se você quiser estar seguro, useByteBuffer.get(byte[] dst, int offset, int length)
para obter bytes do buffer em uma matriz de bytes.fonte
ByteBuffer.get
função, a entrada é novamente um array de bytes, como posso obtê-lo? não faz sentido repetir k.getbytes, não é?ByteBuffer.get(byte[] dst, int offset, int length)
. Você pode construir uma String a partir dele com o construtor String () `String (byte [] bytes, deslocamento interno, comprimento interno, conjunto de caracteres Charset). Você pode usar os mesmos valores de deslocamento e comprimento para ambas as chamadas.k
é uma String, não um ByteBuffer.Há uma abordagem mais simples para decodificar um
ByteBuffer
em umString
sem problemas, mencionada por Andy Thomas.fonte
CharBuffer
decode()
retorno é umCharSequence
(comoString
), então você pode evitar uma cópia extra e usá-la diretamente.Experimente isto:
NB. você não pode converter corretamente uma matriz de bytes em uma String sem saber sua codificação.
Eu espero que isso ajude
fonte
.array()
pode lançar uma exceção..array()
método.array()
, você também deve usararrayOffset()
para começar na posição correta na matriz! Esta é uma armadilha sutil, porque geralmente arrayOffset () é 0; mas nos raros casos em que não é, você obterá bugs difíceis de encontrar se não levar isso em consideração.Só queria ressaltar que não é seguro presumir que ByteBuffer.array () sempre funcionará.
Normalmente buffer.hasArray () sempre será verdadeiro ou falso, dependendo do seu caso de uso. Na prática, a menos que você realmente queira que funcione em qualquer circunstância, é seguro otimizar o branch de que você não precisa. Mas o resto das respostas podem não funcionar com um ByteBuffer criado por meio de ByteBuffer.allocateDirect ().
fonte
ByteBuffer.wrap(bytes, offset, size)
fábrica.array()
irá retornar todo obytes
array. Melhor usar a forma sugerida por xinyong Chengarray()
, você também deve usararrayOffset()
para começar na posição correta na matriz! Esta é uma armadilha sutil, porque geralmente arrayOffset () é 0; mas nos raros casos em que não é, você obterá bugs difíceis de encontrar se não levar isso em consideração.As respostas referentes a simplesmente chamar
array()
não são totalmente corretas: quando o buffer foi parcialmente consumido, ou está se referindo a uma parte de uma matriz (você podeByteBuffer.wrap
uma matriz em um determinado deslocamento, não necessariamente desde o início), temos que levar em conta isso em nossos cálculos. Esta é a solução geral que funciona para buffers em todos os casos (não cobre a codificação):Para questões relacionadas à codificação, consulte a resposta de Andy Thomas.
fonte
Observe (além do problema de codificação) que alguns dos códigos mais complicados vinculados se dão ao trabalho de obter a parte "ativa" do ByteBuffer em questão (por exemplo, usando posição e limite), em vez de simplesmente codificar todos os bytes em toda a matriz de apoio (como muitos dos exemplos nessas respostas fazem).
fonte
Converta uma String em ByteBuffer e, em seguida, de ByteBuffer de volta em String usando Java:
Que imprime a string nua impressa primeiro e, em seguida, o ByteBuffer convertido em array ():
Isso também foi útil para mim, reduzir a string a bytes primitivos pode ajudar a inspecionar o que está acontecendo:
Imprime sua string interpretada como UTF-8 e, em seguida, novamente como ISO-8859-1:
fonte
a raiz desta questão é como decodificar bytes para string?
isso pode ser feito com o JAVA NIO CharSet:
public final CharBuffer decode(ByteBuffer bb)
fonte
fonte