¿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());
}
Mkl Rjv
fuente
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.

Stewart
fuente
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();
Ankur Shanbhag
fuente
14

Simplemente:

String abc="abcdefghight";

byte[] b = abc.getBytes();
Bhavesh
fuente
¿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
11

Puede usar String.getBytes()cual devuelve la byte[]matriz.

Vimal Bera
fuente
7

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

Lucas Hoepner
fuente
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
Yardack
fuente
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
    }
Favnir Liorenth
fuente
1
Esto decodifica una matriz de bytes codificada en hexadecimal. Algo muy diferente de lo que trata esta pregunta.
Palec