Wie konvertiere ich Java String in Byte []?

539

Gibt es eine Möglichkeit, Java Stringin ein byte[]( nicht das Boxed Byte[]) zu konvertieren ?

Wenn Sie dies versuchen:

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

und ich bekomme separate Ausgänge. Die erste Ausgabe kann nicht angezeigt werden, da es sich um eine gzip-Zeichenfolge handelt.

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

Die zweite ist eine Adresse. Gibt es etwas, was ich falsch mache? Ich brauche das Ergebnis in a byte[], um es dem gzip-Dekomprimierer zuzuführen, der wie folgt ist.

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
quelle
Entschuldigung, ich versuche, einen String in Bytearray und zurück zu konvertieren und erhalte ein falsches Ergebnis. Ich werde es in einer Weile bearbeiten und zurückkommen.
Mkl Rjv
9
Ihr Problem ist, dass String.getBytes()tatsächlich ein Byte-Array zurückgegeben wird, aber Ihre Überzeugung, dass das toString()eines Byte-Arrays ein nützliches Ergebnis zurückgibt, ist falsch.
Louis Wasserman

Antworten:

950

Das Objekt, das Ihre Methode decompressGZIP()benötigt, ist a byte[].

Die grundlegende technische Antwort auf die von Ihnen gestellte Frage lautet also:

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

Das Problem, mit dem Sie zu ringen scheinen, ist jedoch, dass dies nicht sehr gut angezeigt wird. Beim Aufrufen erhalten Sie toString()lediglich die Standardeinstellung: Object.toString()Klassenname + Speicheradresse. In Ihrem Ergebnis [B@38ee9f13sind die [BMittel byte[]und 38ee9f13die Speicheradresse, durch eine getrennt @.

Für Anzeigezwecke können Sie verwenden:

Arrays.toString(bytes);

Dies wird jedoch nur als Folge von durch Kommas getrennten Ganzzahlen angezeigt, die möglicherweise Ihren Wünschen entsprechen oder nicht.

Um eine lesbare zu erhalten Stringwieder von einem byte[], verwenden:

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

Der Grund, warum die CharsetVersion bevorzugt wird, ist, dass alle StringObjekte in Java intern als UTF-16 gespeichert werden. Bei der Konvertierung in a erhalten byte[]Sie Stringje nach gewähltem Zeichensatz eine andere Aufteilung der Bytes für die angegebenen Glyphen .

Stewart
quelle
26
Für string.getBytes ("UTF-8") muss eine UnsupportedEncodingException behandelt werden, für string.getBytes (Charset.forName ("UTF-8")) nicht. Wenn ich darüber streite, welche Methode "besser" ist, überlasse ich es dem Leser als Übung.
Michael Warner
20
string.getBytes(StandardCharsets.UTF_8)kann auch verwendet werden, und es ist das gleiche wiestring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan
3
Ich glaube, StandardCharsetsist neu mit Java 7
Stewart
2
Ich verstehe nicht, warum diese Antwort so viele positive Stimmen bekommen hat. Es mag richtig sein, aber es ist nicht sehr hilfreich ... nur ein paar Codezeilen, von denen die meisten bereits im OP vorhanden waren, und nicht zu erklären, was der Unterschied Charset.forName("UTF-8")macht oder warum es wichtig ist.
LarsH
3
@LarsH Du machst einen guten Punkt. Um ehrlich zu sein, hätte ich nie erwartet, dass diese Antwort so populär wird. Ich habe jetzt die Antwort erweitert, um die positiven Stimmen zu "verdienen". Hoffentlich ist es eine Verbesserung.
Stewart
56
  String example = "Convert Java String";
  byte[] bytes = example.getBytes();
Prabhakaran Ramaswamy
quelle
8
Achtung: getBytes () ist plattformabhängig. Bessere Wahl ist getBytes (StandardCharsets.UTF_8)
Anand Rockzz
14

Versuchen Sie es mit String.getBytes (). Es gibt ein Byte [] zurück, das Zeichenfolgendaten darstellt. Beispiel:

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

Einfach:

String abc="abcdefghight";

byte[] b = abc.getBytes();
Bhavesh
quelle
Was ist, wenn abcnicht US-ASCII-Zeichen wie "greater than 2³² − 1"oder nur Binärdaten (wie " A b2") enthalten sind?
U. Windl
Dies funktioniert nicht für Zeichen, da diese Zeichenfolge nur 5 Zeichen enthält. Wenn ich jedoch benutze, habe getBytes()ich 7 Zeichen.
Teocci
11

Sie können verwenden, String.getBytes()welches das byte[]Array zurückgibt .

Vimal Bera
quelle
7

Vielleicht möchten Sie es versuchen return new String(byteout.toByteArray(Charset.forName("UTF-8")))

Lucas Hoepner
quelle
1
Vielen Dank, dass Sie sich von Bytes zu String umkehren.
Trismegistos
1

Es ist nicht erforderlich, Java als String-Parameter zu ändern. Sie müssen den c-Code ändern, um einen String ohne Zeiger und in seinem Code zu erhalten:

Bool DmgrGetVersion (String szVersion);

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

Ich weiß, dass ich etwas spät zur Party komme, aber das funktioniert ziemlich ordentlich (unser Professor hat es uns gegeben)

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
quelle
1
Dies decodiert ein hexadezimal codiertes Bytearray. Etwas ganz anderes als das, worum es in dieser Frage geht.
Palec