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


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.


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


14

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

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

14

Po prostu:

String abc="abcdefghight";

byte[] b = abc.getBytes();

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


7

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


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

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
    }

1
To dekoduje tablicę bajtów w kodzie hex. Coś bardzo odmiennego od tego, o co chodzi w tym pytaniu.
Palec
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.