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.