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());
}
Mkl Rjv
sumber
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.

Stewart
sumber
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
56
  String example = "Convert Java String";
  byte[] bytes = example.getBytes();
Prabhakaran Ramaswamy
sumber
8
Waspadalah: getBytes () bergantung pada platform. Pilihan yang lebih baik adalah menggunakan getBytes (StandardCharsets.UTF_8)
Anand Rockzz
14

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

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

Secara sederhana:

String abc="abcdefghight";

byte[] b = abc.getBytes();
Bhavesh
sumber
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.

Bera Vimal
sumber
7

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

Lucas Hoepner
sumber
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
Yardack
sumber
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
    }
Favnir Liorenth
sumber
1
Ini menerjemahkan array byte hex-encoded. Sesuatu yang sangat berbeda dengan pertanyaan ini.
Palec