¿Es este un enfoque correcto para convertir ByteBuffer en String de esta manera?
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");
La razón por la que pregunto es que esto parece demasiado simple, mientras que otros enfoques como Java: Convertir cadenas desde y hacia ByteBuffer y los problemas asociados parecen más complejos.
java
string
serialization
bytearray
vikky.rk
fuente
fuente
Respuestas:
EDITAR (2018): La respuesta de hermanos editada por @xinyongCheng es un enfoque más simple y debería ser la respuesta aceptada.
Su enfoque sería razonable si supiera que los bytes están en el juego de caracteres predeterminado de la plataforma. En su ejemplo, esto es cierto porque
k.getBytes()
devuelve los bytes en el juego de caracteres predeterminado de la plataforma.Con más frecuencia, querrá especificar la codificación. Sin embargo, hay una forma más sencilla de hacerlo que la pregunta que vinculó. La API de cadena proporciona métodos que convierten entre una cadena y una matriz de bytes [] en una codificación particular. Estos métodos sugieren usar CharsetEncoder / CharsetDecoder "cuando se requiere más control sobre el proceso de decodificación [codificación]".
Para obtener los bytes de una cadena en una codificación particular, puede usar un método hermano getBytes ():
Para poner bytes con una codificación particular en una cadena, puede usar un constructor de cadena diferente:
Tenga en cuenta que
ByteBuffer.array()
es una operación opcional. Si ha construido su ByteBuffer con una matriz, puede usar esa matriz directamente. De lo contrario, si desea estar seguro, useByteBuffer.get(byte[] dst, int offset, int length)
para obtener bytes del búfer en una matriz de bytes.fuente
ByteBuffer.get
función, la entrada es nuevamente una matriz de bytes, ¿cómo puedo obtenerla? no tiene sentido volver a decir k.getbytes, ¿verdad?ByteBuffer.get(byte[] dst, int offset, int length)
. Puede construir un String a partir de él con el constructor String () `String (byte [] bytes, int offset, int length, Charset charset). Puede utilizar los mismos valores de desplazamiento y longitud para ambas llamadas.k
es una cadena, no un ByteBuffer.Hay un enfoque más simple para decodificar un
ByteBuffer
en unString
sin ningún problema, mencionado por Andy Thomas.fuente
CharBuffer
decode()
retornos son unCharSequence
(me gustaString
), por lo que puede evitar una copia adicional y usarla directamente.Prueba esto:
NÓTESE BIEN. no puede convertir correctamente una matriz de bytes en una cadena sin conocer su codificación.
espero que esto ayude
fuente
.array()
pueden generar una excepción..array()
método.array()
, también debe usararrayOffset()
para comenzar en la posición correcta en la matriz. Este es un error sutil, porque normalmente arrayOffset () es 0; pero en los raros casos en los que no lo es, obtendrá errores difíciles de encontrar si no los tiene en cuenta.Solo quería señalar que no es seguro asumir que ByteBuffer.array () siempre funcionará.
Por lo general, buffer.hasArray () siempre será verdadero o falso dependiendo de su caso de uso. En la práctica, a menos que realmente desee que funcione bajo cualquier circunstancia, es seguro optimizar la rama que no necesita. Pero es posible que el resto de las respuestas no funcionen con un ByteBuffer creado mediante ByteBuffer.allocateDirect ().
fuente
ByteBuffer.wrap(bytes, offset, size)
fábrica.array()
, devolverá labytes
matriz completa . Mejor use la forma que sugirió xinyong Chengarray()
, también debe usararrayOffset()
para comenzar en la posición correcta en la matriz. Este es un error sutil, porque normalmente arrayOffset () es 0; pero en los raros casos en los que no lo es, obtendrá errores difíciles de encontrar si no los tiene en cuenta.Las respuestas que se refieren a simplemente llamar
array()
no son del todo correctas: cuando el búfer se ha consumido parcialmente o se refiere a una parte de una matriz (puedeByteBuffer.wrap
una matriz en un desplazamiento dado, no necesariamente desde el principio), tenemos que tener en cuenta eso en nuestros cálculos. Esta es la solución general que funciona para búferes en todos los casos (no cubre la codificación):Para las preocupaciones relacionadas con la codificación, consulte la respuesta de Andy Thomas.
fuente
Tenga en cuenta (aparte del problema de codificación) que algunos de los códigos más complicados vinculados se toman la molestia de obtener la parte "activa" del ByteBuffer en cuestión (por ejemplo, usando la posición y el límite), en lugar de simplemente codificar todos los bytes en toda la matriz de respaldo (como lo hacen muchos de los ejemplos en estas respuestas).
fuente
Convierta una cadena en ByteBuffer, luego de ByteBuffer de nuevo a String usando Java:
Que imprime la cadena desnuda impresa primero, y luego el ByteBuffer convertido en array ():
También esto fue útil para mí, reducir la cadena a bytes primitivos puede ayudar a inspeccionar lo que está sucediendo:
Imprime su cadena interpretada como UTF-8, y luego nuevamente como ISO-8859-1:
fuente
la raíz de esta pregunta es ¿cómo decodificar bytes en cadenas?
esto se puede hacer con JAVA NIO CharSet:
public final CharBuffer decode(ByteBuffer bb)
fuente
fuente