Jak przekonwertować ciąg Java na bajt []?

538

Czy jest jakiś sposób przekonwertować Javę Stringna byte[]( nie w pudełku Byte[])?

Próbując tego:

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

i otrzymuję osobne wyniki. Nie można wyświetlić pierwszego wyjścia, ponieważ jest to ciąg gzip.

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

Drugi to adres. Czy coś robię źle? Potrzebuję wyniku w, byte[]aby podać go do dekompresora gzip, który jest następujący.

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
źródło
Przepraszam, próbuję przekonwertować ciąg znaków na bajtę z powrotem i uzyskanie błędnego wyniku. Zmienię to za chwilę i wrócę.
Mkl Rjv
8
Twoim problemem jest to, że String.getBytes()rzeczywiście zwraca tablicę bajtów, ale twoje przekonanie, że toString()tablica bajtów zwróci użyteczny wynik, jest błędne.
Louis Wasserman,

Odpowiedzi:

948

Obiekt, którego decompressGZIP()potrzebuje Twoja metoda, to byte[].

Tak więc podstawowa, techniczna odpowiedź na zadane pytanie brzmi:

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

Jednak problemem, z którym wydajesz się walczyć, jest to, że nie wyświetla się to zbyt dobrze. Wywołanie toString()da ci tylko domyślną Object.toString()nazwę, którą jest nazwa klasy + adres pamięci. W swoim rezultacie [B@38ee9f13, te [Bśrodki byte[]i 38ee9f13to adres pamięci, oddzielone @.

Do celów wyświetlania możesz użyć:

Arrays.toString(bytes);

Ale wyświetli się to jako sekwencja liczb całkowitych oddzielonych przecinkami, które mogą, ale nie muszą, być tym, czego chcesz.

Aby uzyskać czytelny Stringwróciłem z byte[], należy:

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

Powodem Charsetwersja jest faworyzowany, jest to, że wszystkie Stringobiekty w Javie są przechowywane wewnętrznie jako UTF-16. Konwertując na a byte[]otrzymasz inny podział bajtów dla danych glifów String, w zależności od wybranego zestawu znaków.

Stewart
źródło
26
string.getBytes („UTF-8”) wymaga obsługi UnsupportedEncodingException, podczas gdy string.getBytes (Charset.forName („UTF-8”)) nie. Argumentując, która metoda jest „lepsza”, zostawiam jako ćwiczenie dla czytelnika.
Michael Warner
20
string.getBytes(StandardCharsets.UTF_8)można również użyć i jest to to samo, costring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan
3
Uważam, że StandardCharsetsjest nowy w Javie 7
Stewart
2
Nie rozumiem, dlaczego ta odpowiedź ma tak wiele pozytywnych opinii. Może i ma rację, ale nie jest zbyt pomocny ... tylko kilka wierszy kodu, z których większość ma już OP, i nie wyjaśnia, co Charset.forName("UTF-8")robi różnicę ani dlaczego jest taka ważna.
LarsH
3
@ LarS Masz rację. Szczerze mówiąc, nigdy nie spodziewałem się, że ta odpowiedź stanie się tak popularna. Rozszerzyłem teraz odpowiedź, aby „zasłużyć” na głosowanie. Mam nadzieję, że to poprawa.
Stewart
56
  String example = "Convert Java String";
  byte[] bytes = example.getBytes();
Prabhakaran Ramaswamy
źródło
8
Uwaga: getBytes () zależy od platformy. Lepszym wyborem jest użycie getBytes (StandardCharsets.UTF_8)
Anand Rockzz
14

Spróbuj użyć String.getBytes (). Zwraca bajt [] reprezentujący dane ciągu. Przykład:

String data = "sample data";
byte[] byteData = data.getBytes();
Ankur Shanbhag
źródło
14

Po prostu:

String abc="abcdefghight";

byte[] b = abc.getBytes();
Bhavesz
źródło
Co jeśli abczawiera znaki spoza US-ASCII, takie jak "greater than 2³² − 1"lub tylko dane binarne (takie jak „ A b2”)?
U. Windl
nie działa to dla znaków takich jak ten ciąg ma tylko 5 znaków. Jednak kiedy używam, getBytes()mam 7 znaków.
Teocci
11

Możesz użyć, String.getBytes()który zwraca byte[]tablicę.

Vimal Bera
źródło
7

Możesz spróbować return new String(byteout.toByteArray(Charset.forName("UTF-8")))

Lucas Hoepner
źródło
1
Dziękujemy za pokazanie innej drogi od bajtów do ciągu.
Trismegistos
1

Nie trzeba zmieniać Java jako parametru String. Musisz zmienić kod c, aby otrzymać ciąg bez wskaźnika i jego kod:

Bool DmgrGetVersion (String szVersion);

Char NewszVersion [200];
Strcpy (NewszVersion, szVersion.t_str ());
.t_str () applies to builder c ++ 2010
Yardack
źródło
1

Wiem, że jestem trochę spóźniony na imprezę, ale działa całkiem nieźle (nasz profesor nam to dał)

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
źródło
1
To dekoduje tablicę bajtów w kodzie hex. Coś bardzo odmiennego od tego, o co chodzi w tym pytaniu.
Palec