如何将Java字符串转换为byte []?


538

有什么方法可以将Java转换Stringbyte[]而不是盒装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());

我得到了单独的输出。由于是gzip字符串,因此无法显示第一个输出。

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

第二个是地址。我做错了什么吗?我需要将结果byte[]送入gzip解压缩器,如下所示。

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


抱歉,我正在尝试将String转换为bytearray并返回,并得到错误的结果。我过一会儿再编辑。
Mkl Rjv

8
您的问题是String.getBytes()确实确实返回了字节数组,但是您认为toString()字节数组的会返回有用的结果是错误的。
Louis Wasserman

Answers:


948

您的方法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从背面byte[],使用方法:

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

支持该Charset版本的原因是StringJava中的所有对象在内部都存储为UTF-16。转换为a时byte[],对于给定的字形,您将得到不同的字节细分String,具体取决于所选的字符集。


26
string.getBytes(“ UTF-8”)要求处理UnsupportedEncodingException,而string.getBytes(Charset.forName(“ UTF-8”))则不需要。关于哪种方法“更好”,我作为练习留给读者。
迈克尔·华纳

20
string.getBytes(StandardCharsets.UTF_8)也可以使用,并且它是相同的string.getBytes(Charset.forName("UTF-8"))
Bahadır鸭肝

3
我相信StandardCharsetsJava 7是新的
Stewart

2
我不明白为什么这个答案获得了如此多的赞誉。可能是正确的,但是它并不是很有用……只是几行代码,其中大部分是OP所拥有的,而没有解释差异的Charset.forName("UTF-8")原因或重要性。
LarsH 2015年

3
@LarsH你说的很对。老实说,我从没想到这个答案会如此流行。我现在扩展了答案,以便“应得”投票。希望这是一个进步。
斯图尔特


14

尝试使用String.getBytes()。它返回一个代表字符串数据的byte []。例:

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 '18

这不适用于像该字符串只有5个字符的字符。但是,当我使用 getBytes()我有7个字符。
Teocci'1



1

不必将java更改为String参数。您必须更改c代码才能在其代码中接收没有指针的String:

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
这将对十六进制编码的字节数组进行解码。与这个问题的含义完全不同。
Palec
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.