Nasıl Java String byte [] dönüştürmek için?


539

Java'yı Stringbir byte[]( kutuya değilByte[] ) dönüştürmenin herhangi bir yolu var mı ?

Bunu denerken:

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

ve ayrı çıktılar alıyorum. Bir gzip dizgisi olduğu için 1. çıkış görüntülenemiyor.

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

İkincisi bir adrestir. Yanlış yaptığım bir şey var mı? Ben sonuç byte[]aşağıdaki gibi gzip dekompresör beslemek için bir gerekir .

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


Üzgünüz, bir String bytearray ve geri dönüştürmek ve yanlış bir sonuç elde etmeye çalışıyorum. Bir süre sonra düzenleyip geri döneceğim.
— Mkl Rjv

8
Sorununuz String.getBytes()gerçekten bir bayt dizisi döndürüyor, ancak toString()bir bayt dizisinin yararlı bir sonuç döndüreceğine olan inancınız yanlış.
— Louis Wasserman

Yanıtlar:


949

Yöntemin decompressGZIP()ihtiyaç duyduğu nesne a byte[].

Bu nedenle, sorduğunuz sorunun temel, teknik yanıtı şöyledir:

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

Bununla birlikte, güreşmiş gibi göründüğünüz sorun, bunun çok iyi görünmemesi. Arama toString(), varsayılan Object.toString()olarak sınıf adı + bellek adresi olanı verecektir . Sonuçta [B@38ee9f13, [Banlamına gelir byte[]ve 38ee9f13. İle ayrılmış bellek adresidir @.

Görüntüleme amacıyla şunları kullanabilirsiniz:

Arrays.toString(bytes);

Ancak bu yalnızca, virgülle ayrılmış tam sayılar dizisi olarak görüntülenecektir; bu, istediğiniz gibi olabilir veya olmayabilir.

A'dan okunabilir bir Stringgeri almak için şunu byte[]kullanın:

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

CharsetSürümün tercih edilmesinin nedeni, StringJava'daki tüm nesnelerin dahili olarak UTF-16 olarak depolanmasıdır. Bir dönüştürürken , seçilen karakter kümesine bağlı olarak, byte[]verilen glifler için farklı bir bayt dökümü elde edersiniz String.


26
string.getBytes ("UTF-8") bir UnsupportedEncodingException işlemesini gerektirirken string.getBytes (Charset.forName ("UTF-8")) gerektirmez. Hangi yöntemin "daha iyi" olduğunu tartışmak okuyucu için bir egzersiz olarak ayrılıyorum.
— Michael Warner

20
string.getBytes(StandardCharsets.UTF_8)kullanılabilir ve aynıdırstring.getBytes(Charset.forName("UTF-8"))
— Bahadır Yağan

3
StandardCharsetsJava 7 ile yeni olduğuna inanıyorum
— Stewart

2
Bu cevabın neden bu kadar çok oy aldığını anlamıyorum. Doğru olabilir, ancak çok yararlı değil ... çoğu OP'nin zaten sahip olduğu ve farkın ne yaptığını Charset.forName("UTF-8")veya neden önemli olduğunu açıklayan sadece birkaç satır kod .
— LarsH

3
@LarsH İyi bir noktaya değindin. Dürüst olmak gerekirse, bu cevabın bu kadar popüler olmasını hiç beklemiyordum. Şimdi cevapları "hak etmek" için cevabı genişlettim. Umarım bu bir gelişmedir.
— Stewart


14

String.getBytes () yöntemini kullanmayı deneyin. Dize verilerini temsil eden bir bayt [] döndürür. Misal:

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

14

basitçe:

String abc="abcdefghight";

byte[] b = abc.getBytes();

Ya abcABD "greater than 2³² − 1"verileri gibi ya da sadece ikili veri ("orA b2" gibi) olmayan karakterler içeriyorsa ?
— U. Windl

bu karakter � dizisinde sadece 5 karakter olduğu için bu işe yaramaz . Ancak kullandığımda getBytes()7 karakterim var.
— Teocci

11

Diziyi String.getBytes()döndüren öğeyi kullanabilirsiniz byte[].


7

Denemek isteyebilirsiniz return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
Bayttan Dize'ye başka bir yol gösterdiğiniz için teşekkür ederiz.
— Trismegistos

1

Java'yı bir String parametresi olarak değiştirmek gerekli değildir. İşaretçisiz ve kodunda bir Dize almak için c kodunu değiştirmeniz gerekir:

Bool DmgrGetVersion (String szVersion);

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

1

Partiye biraz geç kaldığımı biliyorum ama bu çok düzgün çalışıyor (profesörümüz bize verdi)

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
Bu, onaltılık kodlu bayt dizisinin kodunu çözer. Bu sorunun ne olduğundan çok farklı bir şey.
— Palec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.