วิธีการแปลง Java String เป็นไบต์ []?


539

มีวิธีการแปลง Java Stringเป็นbyte[]( ไม่ใช่กล่องByte[]) หรือไม่

ในการลองนี้:

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

และฉันได้รับเอาต์พุตแยกจากกัน ไม่สามารถแสดงเอาต์พุตที่ 1 เนื่องจากเป็นสตริง gzip

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

ที่สองคือที่อยู่ มีอะไรที่ฉันทำผิดหรือเปล่า? ฉันต้องการผลลัพธ์ในการbyte[]ป้อนให้ gzip decompressor ซึ่งมีดังต่อไปนี้

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


ขออภัยฉันพยายามแปลงสตริงเป็น bytearray และย้อนกลับและได้รับผลลัพธ์ที่ผิด ฉันจะแก้ไขในขณะที่และกลับ
Mkl Rjv

8
ปัญหาของคุณคือการString.getBytes()ส่งคืนอาร์เรย์ไบต์ แต่คุณเชื่อว่าtoString()อาร์เรย์ของไบต์จะส่งคืนผลลัพธ์ที่มีประโยชน์ไม่ถูกต้อง
Louis Wasserman

คำตอบ:


949

วัตถุที่วิธีการของคุณต้องการเป็นdecompressGZIP()byte[]

ดังนั้นคำตอบทางเทคนิคขั้นพื้นฐานสำหรับคำถามที่คุณถามคือ:

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

อย่างไรก็ตามปัญหาที่คุณดูเหมือนจะมวยปล้ำด้วยคือสิ่งนี้แสดงได้ไม่ดีนัก การโทรtoString()จะให้ค่าเริ่มต้นObject.toString()ซึ่งเป็นชื่อคลาส + ที่อยู่หน่วยความจำ ในผลลัพธ์ของคุณ[B@38ee9f13ที่[Bวิธีการbyte[]และที่อยู่หน่วยความจำที่แยกจากกันโดย38ee9f13@

สำหรับการแสดงผลคุณสามารถใช้:

Arrays.toString(bytes);

แต่นี่จะแสดงเป็นลำดับของจำนวนเต็มที่คั่นด้วยเครื่องหมายจุลภาคซึ่งอาจเป็นหรือไม่ใช่สิ่งที่คุณต้องการ

ในการรับStringกลับมาจาก a byte[]ให้ใช้:

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

เหตุผลที่Charsetเวอร์ชั่นนี้ได้รับการรองรับคือStringวัตถุทั้งหมดใน Java ถูกจัดเก็บภายในเป็น UTF-16 เมื่อแปลงเป็น a byte[]คุณจะได้รับการแบ่งไบต์ที่แตกต่างกันสำหรับร่ายมนตร์ที่กำหนดของStringขึ้นอยู่กับ charset ที่เลือก


26
string.getBytes ("UTF-8") ต้องการการจัดการ UnsupportedEncodingException ในขณะที่ string.getBytes (Charset.forName ("UTF-8")) ไม่มี การโต้เถียงว่าวิธีไหนดีกว่าฉันออกไปเป็นการออกกำลังกายสำหรับผู้อ่าน
Michael Warner

20
string.getBytes(StandardCharsets.UTF_8)สามารถใช้และมันก็เป็นเช่นเดียวกับstring.getBytes(Charset.forName("UTF-8"))
BahadırYağan

3
ฉันเชื่อว่าStandardCharsetsใหม่กับ Java 7
Stewart

2
ฉันไม่เข้าใจว่าทำไมคำตอบนี้มี upvotes มากมาย อาจจะใช่ แต่ก็ไม่ค่อยมีประโยชน์ ... แค่โค้ดสองบรรทัดซึ่ง OP ส่วนใหญ่มีอยู่แล้วและไม่ได้อธิบายว่าอะไรCharset.forName("UTF-8")ทำให้เกิดความแตกต่างหรือเหตุผลที่สำคัญ
LarsH

3
@ LarsH คุณทำให้เป็นจุดที่ดี พูดตามตรงฉันไม่เคยคาดหวังคำตอบนี้จะเป็นที่นิยม ตอนนี้ฉันได้ขยายคำตอบเพื่อ "สมควร" ผู้อัปโหลด หวังว่ามันจะเป็นการปรับปรุง
Stewart


14

ลองใช้ String.getBytes () มันจะส่งกลับไบต์ [] แทนข้อมูลสตริง ตัวอย่าง:

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

14

เพียง:

String abc="abcdefghight";

byte[] b = abc.getBytes();

จะเกิดอะไรขึ้นถ้าabcมีอักขระที่ไม่ใช่ US-ASCII เช่น"greater than 2³² − 1"หรือเพียงแค่ข้อมูลไบนารี (เช่น " A b2")
U. Windl

สิ่งนี้ใช้ไม่ได้กับตัวละครเช่นสายนี้มีเพียง 5 ตัว อย่างไรก็ตามเมื่อฉันใช้ getBytes()ฉันได้ 7 ตัวอักษร
Teocci


7

คุณอาจต้องการลอง return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
ขอขอบคุณที่แสดงวิธีอื่นตั้งแต่ไบต์ไปจนถึงสตริง
Trismegistos

1

ไม่จำเป็นต้องเปลี่ยน java เป็นพารามิเตอร์ String คุณต้องเปลี่ยนรหัส c เพื่อรับสตริงโดยไม่มีตัวชี้และในรหัส:

Bool DmgrGetVersion (String szVersion);

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

1

ฉันรู้ว่าฉันมาสายเล็ก ๆ น้อย ๆ แต่งานนี้ค่อนข้างเรียบร้อย (อาจารย์ของเรามอบมันให้เรา)

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
วิธีนี้จะถอดรหัสอาร์เรย์แบบไบต์ที่เข้ารหัสด้วย hex สิ่งที่แตกต่างจากคำถามนี้เป็นอย่างมาก
Palec
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.