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.