Bagaimana cara mengubah Java String ke byte []?


539

Apakah ada cara untuk mengkonversi Java Stringke byte[]( bukan kotak Byte[])?

Dalam mencoba ini:

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

dan saya mendapatkan output terpisah. Tidak dapat menampilkan keluaran pertama karena merupakan string gzip.

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

Yang kedua adalah alamat. Apakah ada yang saya lakukan salah? Saya membutuhkan hasil dalam byte[]untuk memberi makannya ke gzip decompressor, yaitu sebagai berikut.

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


Maaf, saya mencoba mengubah String menjadi bytearray dan kembali dan mendapatkan hasil yang salah. Saya akan mengeditnya sebentar dan kembali.
Mkl Rjv

9
Masalah Anda adalah bahwa String.getBytes()memang mengembalikan array byte, tetapi keyakinan Anda bahwa toString()array byte akan mengembalikan hasil yang bermanfaat salah.
Louis Wasserman

Jawaban:


951

Objek yang decompressGZIP()dibutuhkan metode Anda adalah a byte[].

Jadi jawaban dasar dan teknis untuk pertanyaan yang Anda ajukan adalah:

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

Namun masalah Anda tampaknya bergulat dengan ini adalah bahwa ini tidak ditampilkan dengan sangat baik. Memanggil toString()hanya akan memberi Anda default Object.toString()yang merupakan nama kelas + alamat memori. Dalam hasil Anda [B@38ee9f13, [Bsarana byte[]dan 38ee9f13alamat memori, dipisahkan oleh @.

Untuk tujuan tampilan Anda dapat menggunakan:

Arrays.toString(bytes);

Tetapi ini hanya akan ditampilkan sebagai urutan bilangan bulat yang dipisahkan koma, yang mungkin atau mungkin tidak seperti yang Anda inginkan.

Untuk mendapatkan Stringkembali yang dapat dibaca dari byte[], gunakan:

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

Alasan Charsetversi disukai, adalah bahwa semua Stringobjek di Jawa disimpan secara internal sebagai UTF-16. Ketika mengkonversi ke byte[]Anda akan mendapatkan rincian byte yang berbeda untuk mesin terbang yang diberikan itu String, tergantung pada charset yang dipilih.


26
string.getBytes ("UTF-8") memerlukan penanganan UnsupportedEncodingException, sementara string.getBytes (Charset.forName ("UTF-8")) tidak. Berdebat tentang metode mana yang "lebih baik" saya tinggalkan sebagai latihan untuk pembaca.
Michael Warner

20
string.getBytes(StandardCharsets.UTF_8)juga dapat digunakan, dan itu sama denganstring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan

3
Saya percaya StandardCharsetsini baru dengan Java 7
Stewart

2
Saya tidak mengerti mengapa jawaban ini mendapat banyak upvotes. Mungkin benar, tetapi tidak terlalu membantu ... hanya beberapa baris kode, yang sebagian besar sudah dimiliki OP, dan tidak menjelaskan perbedaan apa yang Charset.forName("UTF-8")membuat atau mengapa itu penting.
LarsH

3
@ LarsH Anda membuat poin yang bagus. Sejujurnya, saya tidak pernah berharap jawaban ini menjadi begitu populer. Saya sekarang telah memperluas jawaban untuk "pantas" mendapatkan upvotes. Semoga ini perbaikan.
Stewart


14

Coba gunakan String.getBytes (). Ia mengembalikan byte [] yang mewakili data string. Contoh:

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

14

Secara sederhana:

String abc="abcdefghight";

byte[] b = abc.getBytes();

Bagaimana jika abcmengandung karakter non-ASCII, suka "greater than 2³² − 1"atau hanya data biner (seperti " A b2")?
U. Windl

ini tidak berfungsi untuk karakter seperti string ini hanya memiliki 5 karakter. Namun ketika saya menggunakan getBytes()saya mendapat 7 karakter.
Teocci

11

Anda dapat menggunakan String.getBytes()yang mengembalikan byte[]array.


7

Anda mungkin ingin mencoba return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
Terima kasih telah menunjukkan jalan lain dari byte ke String.
Trismegistos

1

Tidak perlu mengubah java sebagai parameter String. Anda harus mengubah kode c untuk menerima sebuah String tanpa pointer dan dalam kode-nya:

Bool DmgrGetVersion (String szVersion);

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

1

Saya tahu saya sedikit terlambat untuk pesta tetapi ini bekerja cukup rapi (profesor kami memberikannya kepada kami)

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
Ini menerjemahkan array byte hex-encoded. Sesuatu yang sangat berbeda dengan pertanyaan ini.
Palec
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.