Come convertire Java String in byte []?


539

Esiste un modo per convertire Java Stringin un byte[]( non il boxed Byte[])?

Nel provare questo:

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 sto ottenendo output separati. Impossibile visualizzare il primo output in quanto è una stringa gzip.

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

Il secondo è un indirizzo. C'è qualcosa che sto facendo di sbagliato? Ho bisogno del risultato in a byte[]per alimentarlo con decompressore gzip, che è il seguente.

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


Siamo spiacenti, sto cercando di convertire una stringa in bytearray e ritorno e ottenere un risultato errato. Lo modificherò tra poco e torno.
Mkl Rjv,

9
Il tuo problema è che in String.getBytes()effetti restituisce un array di byte, ma la tua convinzione che toString()un array di byte restituirà un risultato utile non è corretta.
Louis Wasserman,

Risposte:


951

L'oggetto di cui il tuo metodo ha decompressGZIP()bisogno è a byte[].

Quindi la risposta tecnica di base alla domanda che hai posto è:

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

Tuttavia, il problema con cui sembra lottare è che questo non viene visualizzato molto bene. Chiamare toString()ti darà solo il valore predefinito Object.toString()che è il nome della classe + indirizzo di memoria. Nel tuo risultato [B@38ee9f13, il [Bmezzo byte[]ed 38ee9f13è l'indirizzo di memoria, separato da un @.

Ai fini della visualizzazione è possibile utilizzare:

Arrays.toString(bytes);

Ma questo verrà visualizzato solo come una sequenza di numeri interi separati da virgola, che possono essere o meno ciò che desideri.

Per ottenere una lettura leggibile Stringda a byte[], utilizzare:

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

Il motivo per cui la Charsetversione è preferita è che tutti gli Stringoggetti in Java sono archiviati internamente come UTF-16. Quando si converte in a, byte[]si otterrà una diversa suddivisione dei byte per i glifi indicati String, a seconda del set di caratteri scelto.


26
string.getBytes ("UTF-8") richiede la gestione di UnsupportedEncodingException, mentre string.getBytes (Charset.forName ("UTF-8")) no. Discutendo su quale metodo sia "migliore", lascio come esercizio per il lettore.
Michael Warner,

20
string.getBytes(StandardCharsets.UTF_8)può anche essere usato ed è lo stesso distring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan,

3
Credo che StandardCharsetssia nuovo con Java 7
Stewart il

2
Non capisco perché questa risposta abbia ottenuto così tanti voti. Potrebbe essere giusto, ma non è molto utile ... solo un paio di righe di codice, la maggior parte delle quali l'OP aveva già, e non spiega quale differenza Charset.forName("UTF-8")fa o perché è importante.
LarsH,

3
@LarsH Hai ragione. Ad essere sincero, non mi sarei mai aspettato che questa risposta diventasse così popolare. Ora ho ampliato la risposta per "meritare" i voti. Spero sia un miglioramento.
Stewart,


14

Prova a utilizzare String.getBytes (). Restituisce un byte [] che rappresenta i dati di stringa. Esempio:

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

14

Semplicemente:

String abc="abcdefghight";

byte[] b = abc.getBytes();

Cosa succede se abccontiene caratteri non US-ASCII, come "greater than 2³² − 1"o solo dati binari (come " A b2")?
U. Windl,

questo non funziona per caratteri come questa stringa ha solo 5 caratteri. Tuttavia quando uso getBytes()ho 7 caratteri.
Teocci,

11

È possibile utilizzare String.getBytes()quale restituisce l' byte[]array.


7

Potresti voler provare return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
Grazie per esserti mostrato diversamente dai byte alla stringa.
Trismegisto

1

Non è necessario modificare java come parametro String. Devi modificare il codice c per ricevere una stringa senza un puntatore e nel suo codice:

Bool DmgrGetVersion (String szVersion);

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

1

So di essere un po 'in ritardo alla festa, ma funziona abbastanza bene (il nostro professore ce l'ha dato)

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
Questo decodifica array di byte con codifica esadecimale. Qualcosa di molto diverso da ciò di cui tratta questa domanda.
Palec,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.