Como converter Java String em byte []?

539

Existe alguma maneira de converter Java Stringpara um byte[]( não o in a box Byte[])?

Ao tentar isso:

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());

e estou recebendo saídas separadas. Não foi possível exibir a primeira saída, pois é uma sequência de gzip.

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

O segundo é um endereço. Há algo que estou fazendo de errado? Eu preciso do resultado em um byte[]para alimentá-lo ao descompactador gzip, que é o seguinte.

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
fonte
Desculpe, estou tentando converter uma String para bytearray e vice-versa e obtendo um resultado errado. Vou editá-lo daqui a pouco e voltar.
MKL RJV
9
Seu problema é que String.getBytes()realmente retorna uma matriz de bytes, mas sua crença de que a toString()matriz de bytes retornará um resultado útil está incorreta.
Louis Wasserman

Respostas:

951

O objeto que seu método decompressGZIP()precisa é um byte[].

Portanto, a resposta técnica básica à pergunta que você fez é:

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

No entanto, o problema com o qual você parece estar lutando é que isso não aparece muito bem. A chamada toString()apenas fornecerá o padrão, Object.toString()que é o nome da classe + o endereço da memória. No seu resultado [B@38ee9f13, os [Bmeios byte[]e 38ee9f13o endereço da memória, separados por um @.

Para fins de exibição, você pode usar:

Arrays.toString(bytes);

Mas isso será exibido apenas como uma sequência de números inteiros separados por vírgula, que pode ou não ser o que você deseja.

Para obter um Stringretorno legível de a byte[], use:

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

A razão pela qual a Charsetversão é favorecida é que todos os Stringobjetos em Java são armazenados internamente como UTF-16. Ao converter para um, byte[]você obterá uma divisão diferente de bytes para os glifos fornecidos String, dependendo do conjunto de caracteres escolhido.

Stewart
fonte
26
string.getBytes ("UTF-8") requer manipulação de UnsupportedEncodingException, enquanto string.getBytes (Charset.forName ("UTF-8")) não. Discutindo qual método é "melhor", deixo como exercício para o leitor.
Michael Warner
20
string.getBytes(StandardCharsets.UTF_8)também pode ser usado e é o mesmo questring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan
3
Eu acredito que StandardCharsetsé novo no Java 7
Stewart
2
Não entendo por que essa resposta recebeu tantos votos positivos. Pode estar certo, mas não é muito útil ... apenas algumas linhas de código, a maioria das quais o OP já possuía, e não explicar o que a diferença Charset.forName("UTF-8")faz ou por que é importante.
LarsH 13/10
3
@LarsH Você faz um bom argumento. Para ser sincero, nunca esperei que essa resposta se tornasse tão popular. Agora ampliei a resposta para "merecer" os votos positivos. Espero que seja uma melhoria.
Stewart
56
  String example = "Convert Java String";
  byte[] bytes = example.getBytes();
Prabhakaran Ramaswamy
fonte
8
Cuidado: getBytes () depende da plataforma. Melhor opção é usar getBytes (StandardCharsets.UTF_8)
Anand Rockzz
14

Tente usar String.getBytes (). Retorna um byte [] que representa os dados da string. Exemplo:

String data = "sample data";
byte[] byteData = data.getBytes();
Ankur Shanbhag
fonte
14

Simplesmente:

String abc="abcdefghight";

byte[] b = abc.getBytes();
Bhavesh
fonte
E se abccontiver caracteres não US-ASCII, como "greater than 2³² − 1"ou apenas dados binários (como " A 2")?
U. Windl
isso não funciona para caracteres como essa sequência tem apenas 5 caracteres. No entanto, quando eu uso, getBytes()tenho 7 caracteres.
Teocci 4/01/19
11

Você pode usar o String.getBytes()que retorna a byte[]matriz.

Vimal Bera
fonte
7

Você pode querer tentar return new String(byteout.toByteArray(Charset.forName("UTF-8")))

Lucas Hoepner
fonte
1
Obrigado por mostrar o caminho inverso de bytes para String.
Trismegistos
1

Não é necessário alterar o java como um parâmetro String. Você precisa alterar o código c para receber uma String sem um ponteiro e em seu código:

Bool DmgrGetVersion (String szVersion);

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

Eu sei que estou um pouco atrasado para a festa, mas isso funciona muito bem (nosso professor nos deu)

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
fonte
1
Isso decodifica a matriz de bytes codificada em hexadecimal. Algo muito diferente do que é essa pergunta.
Palec 12/05/19