¿Cómo convertir Java String en byte []?


539

¿Hay alguna forma de convertir Java Stringa a byte[]( no en caja Byte[])?

Al intentar esto:

System.out.println(response.split("\r\n\r\n")[1]);
System.out.println("******");
System.out.println(response.split("\r\n\r\n")[1].getBytes().toString());

y estoy obteniendo salidas separadas. No se puede mostrar la primera salida, ya que es una cadena gzip.

<A Gzip String>
******
[B@38ee9f13

El segundo es una dirección. ¿Hay algo que esté haciendo mal? Necesito el resultado en a byte[]para alimentarlo al descompresor gzip, que es el siguiente.

String decompressGZIP(byte[] gzip) throws IOException {
    java.util.zip.Inflater inf = new java.util.zip.Inflater();
    java.io.ByteArrayInputStream bytein = new java.io.ByteArrayInputStream(gzip);
    java.util.zip.GZIPInputStream gzin = new java.util.zip.GZIPInputStream(bytein);
    java.io.ByteArrayOutputStream byteout = new java.io.ByteArrayOutputStream();
    int res = 0;
    byte buf[] = new byte[1024];
    while (res >= 0) {
        res = gzin.read(buf, 0, buf.length);
        if (res > 0) {
            byteout.write(buf, 0, res);
        }
    }
    byte uncompressed[] = byteout.toByteArray();
    return (uncompressed.toString());
}


Lo siento, estoy tratando de convertir una cadena a bytearray y viceversa y obtengo un resultado incorrecto. Lo editaré en un momento y volveré.
Mkl Rjv

99
Su problema es que de String.getBytes()hecho devuelve una matriz de bytes, pero su creencia de que la toString()de una matriz de bytes devolverá un resultado útil es incorrecta.
Louis Wasserman

Respuestas:


951

El objeto que decompressGZIP()necesita su método es a byte[].

Entonces, la respuesta técnica básica a la pregunta que ha formulado es:

byte[] b = string.getBytes();
byte[] b = string.getBytes(Charset.forName("UTF-8"));
byte[] b = string.getBytes(StandardCharsets.UTF_8); // Java 7+ only

Sin embargo, el problema con el que parece estar luchando es que esto no se ve muy bien. Llamar toString()solo le dará el valor predeterminado, Object.toString()que es el nombre de la clase + la dirección de memoria. En su resultado [B@38ee9f13, el [Bmedio byte[]y 38ee9f13es la dirección de memoria, separados por un @.

Para fines de visualización, puede usar:

Arrays.toString(bytes);

Pero esto solo se mostrará como una secuencia de enteros separados por comas, que pueden o no ser lo que desea.

Para obtener una Stringrespuesta legible de a byte[], use:

String string = new String(byte[] bytes, Charset charset);

La razón por la que Charsetse prefiere la versión es que todos los Stringobjetos en Java se almacenan internamente como UTF-16. Al convertir a un byte[], obtendrá un desglose diferente de bytes para los glifos dados String, dependiendo del conjunto de caracteres elegido.


26
string.getBytes ("UTF-8") requiere el manejo de UnsupportedEncodingException, mientras que string.getBytes (Charset.forName ("UTF-8")) no. Argumentando qué método es "mejor", lo dejo como ejercicio para el lector.
Michael Warner

20
string.getBytes(StandardCharsets.UTF_8)también se puede usar, y es lo mismo questring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan

3
Creo que StandardCharsetses nuevo con Java 7
Stewart

2
No entiendo por qué esta respuesta obtuvo tantos votos positivos. Puede ser correcto, pero no es muy útil ... solo un par de líneas de código, la mayoría de las cuales ya tenía el OP, y no explica qué diferencia Charset.forName("UTF-8")hace o por qué es importante.
LarsH

3
@LarsH Haces un buen punto. Para ser honesto, nunca esperé que esta respuesta fuera tan popular. Ahora he ampliado la respuesta para "merecer" los votos a favor. Esperemos que sea una mejora.
Stewart


14

Intenta usar String.getBytes (). Devuelve un byte [] que representa datos de cadena. Ejemplo:

String data = "sample data";
byte[] byteData = data.getBytes();

14

Simplemente:

String abc="abcdefghight";

byte[] b = abc.getBytes();

¿Qué sucede si abccontiene caracteres no estadounidenses ASCII, como "greater than 2³² − 1"o solo datos binarios (como " A b2")?
U. Windl

esto no funciona para caracteres como esta cadena tiene solo 5 caracteres. Sin embargo, cuando lo uso getBytes()tengo 7 caracteres.
Teocci


7

Quizás quieras probar return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
Gracias por mostrar lo contrario de bytes a String.
Trismegistos

1

No es necesario cambiar java como un parámetro de cadena. Debe cambiar el código c para recibir una cadena sin puntero y en su código:

Bool DmgrGetVersion (String szVersion);

Char NewszVersion [200];
Strcpy (NewszVersion, szVersion.t_str ());
.t_str () applies to builder c ++ 2010

1

Sé que llego un poco tarde a la fiesta, pero esto funciona bastante bien (nuestro profesor nos lo dio)

public static byte[] asBytes (String s) {                   
           String tmp;
           byte[] b = new byte[s.length() / 2];
           int i;
           for (i = 0; i < s.length() / 2; i++) {
             tmp = s.substring(i * 2, i * 2 + 2);
             b[i] = (byte)(Integer.parseInt(tmp, 16) & 0xff);
           }
           return b;                                            //return bytes
    }

1
Esto decodifica una matriz de bytes codificada en hexadecimal. Algo muy diferente de lo que trata esta pregunta.
Palec
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.