Làm cách nào để chuyển đổi Chuỗi Java thành byte []?


539

Có cách nào để chuyển đổi Java Stringthành một byte[]( không phải là hộp Byte[]) không?

Trong việc thử này:

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

và tôi đang nhận được đầu ra riêng biệt. Không thể hiển thị đầu ra thứ 1 vì đây là chuỗi gzip.

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

Thứ hai là một địa chỉ. Có điều gì tôi đang làm sai? Tôi cần kết quả trong byte[]việc cung cấp nó cho bộ giải nén gzip, như sau.

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


Xin lỗi, tôi đang cố gắng chuyển đổi Chuỗi thành bytearray và quay lại và nhận kết quả sai. Tôi sẽ chỉnh sửa nó trong một thời gian và lấy lại.
Mkl Rjv

9
Vấn đề của bạn là điều String.getBytes()đó thực sự trả về một mảng byte, nhưng bạn tin rằng toString()mảng byte sẽ trả về kết quả hữu ích là không chính xác.
Louis Wasserman

Câu trả lời:


950

Đối tượng mà phương thức của bạn decompressGZIP()cần là a byte[].

Vì vậy, câu trả lời cơ bản, kỹ thuật cho câu hỏi bạn đã hỏi là:

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

Tuy nhiên, vấn đề mà bạn có vẻ đang vật lộn là điều này không hiển thị tốt lắm. Gọi toString()sẽ chỉ cho bạn mặc định Object.toString()đó là tên lớp + địa chỉ bộ nhớ. Trong kết quả của bạn [B@38ee9f13, [Bphương tiện byte[]38ee9f13là địa chỉ bộ nhớ, cách nhau bởi một @.

Đối với mục đích hiển thị, bạn có thể sử dụng:

Arrays.toString(bytes);

Nhưng điều này sẽ chỉ hiển thị dưới dạng một chuỗi các số nguyên được phân tách bằng dấu phẩy, có thể hoặc không thể là những gì bạn muốn.

Để lấy Stringlại từ a byte[], hãy sử dụng:

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

Lý do Charsetphiên bản được ưa chuộng là vì tất cả Stringcác đối tượng trong Java được lưu trữ bên trong dưới dạng UTF-16. Khi chuyển đổi sang một, byte[]bạn sẽ nhận được một phân tích byte khác nhau cho các glyph đã cho String, tùy thuộc vào bộ ký tự được chọn.


26
string.getBytes ("UTF-8") yêu cầu xử lý UnsupportedEncodingException, trong khi string.getBytes (Charset.forName ("UTF-8")) thì không. Tranh luận về phương pháp nào là "tốt hơn" tôi để lại như một bài tập cho người đọc.
Michael Warner

20
string.getBytes(StandardCharsets.UTF_8)cũng có thể được sử dụng, và nó cũng giống nhưstring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan

3
Tôi tin StandardCharsetslà mới với Java 7
Stewart

2
Tôi không hiểu tại sao câu trả lời này lại có quá nhiều sự ủng hộ. Điều đó có thể đúng, nhưng nó không hữu ích lắm ... chỉ là một vài dòng mã, hầu hết trong số đó OP đã có, và không giải thích sự khác biệt nào Charset.forName("UTF-8")tạo ra hoặc tại sao nó quan trọng.
LarsH

3
@LarsH Bạn làm cho một điểm tốt. Thành thật mà nói, tôi không bao giờ mong đợi câu trả lời này trở nên phổ biến. Bây giờ tôi đã mở rộng câu trả lời để "xứng đáng" nhận được. Hy vọng đó là một sự cải tiến.
Stewart


14

Hãy thử sử dụng String.getBytes (). Nó trả về một byte [] đại diện cho dữ liệu chuỗi. Thí dụ:

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

14

Đơn giản:

String abc="abcdefghight";

byte[] b = abc.getBytes();

Điều gì xảy ra nếu abcchứa các ký tự không phải US-ASCII, như "greater than 2³² − 1"hoặc chỉ là dữ liệu nhị phân (như "A b2")?
U. Windl

Điều này không hoạt động đối với các ký tự như chuỗi này chỉ có 5 ký tự. Tuy nhiên khi tôi sử dụng getBytes()tôi có 7 ký tự.
Teocci

11

Bạn có thể sử dụng String.getBytes()mà trả về byte[]mảng.


7

Bạn có thể muốn thử return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
Cảm ơn vì đã chỉ ra cách khác từ byte đến String.
Trismegistos

1

Không cần thiết phải thay đổi java dưới dạng tham số String. Bạn phải thay đổi mã c để nhận Chuỗi không có con trỏ và trong mã của nó:

Bool DmgrGetVersion (String szVersion);

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

1

Tôi biết tôi là một bữa tiệc muộn muộn nhưng công việc này khá gọn gàng (giáo sư của chúng tôi đã đưa nó cho chúng tôi)

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
Điều này giải mã mảng byte được mã hóa hex. Một cái gì đó rất khác với những gì câu hỏi này là về.
Palec
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.