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

602

有没有办法将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());

我得到了不同的输出结果。由于它是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());
}

2
https://dev59.com/9G035IYBdhLWcg3wTuJu - Paddyd
抱歉,我正试图将一个字符串转换为字节数组并返回,但结果出现错误。我会稍后进行编辑并回复。 - Mkl Rjv
13
您的问题在于,String.getBytes()确实返回一个字节数组,但您认为字节数组的toString()方法会返回有用的结果是不正确的。 - Louis Wasserman
8个回答

1054

你的方法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);

但是这样只会显示为逗号分隔的整数序列,可能不是你想要的。

要从byte[]中获得可读的String,请使用:

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

之所以偏爱使用Charset版本,是因为Java中所有的String对象在内部存储时都是UTF-16格式。转换成byte[]时,取决于所选择的字符集,所得到的字节序列将不同于该String中给定字形的分解。


28
使用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ır Yağan
3
我相信 StandardCharsets 是 Java 7 中新增的。 - Stewart
2
我不明白为什么这个答案会得到这么多赞。它可能是正确的,但并没有太大的帮助……只有几行代码,其中大部分是原始问题(OP)已经有的,并且没有解释Charset.forName("UTF-8")的区别或者为什么它很重要。 - LarsH
5
@LarsH 你说得很好。 老实说,我从没想过这个答案会变得如此受欢迎。 现在我已经扩展了答案,以便“配得上”这些点赞。 希望这是一个改进。 - Stewart
显示剩余5条评论

65
  String example = "Convert Java String";
  byte[] bytes = example.getBytes();

13
注意:getBytes() 取决于平台。更好的选择是使用 getBytes(StandardCharsets.UTF_8) - Anand Rockzz
1
方法 getBytes 现在已经过时。 - D.A.H

17

简单来说:

String abc="abcdefghight";

byte[] b = abc.getBytes();

如果 abc 包含非 US-ASCII 字符,例如 "greater than 2³² − 1" 或二进制数据(如 "�A���b2"),该怎么办? - U. Windl
这段程序相关的内容翻译为中文如下:这个字符串无法正常工作,它只有5个字符。但是当我使用“getBytes()”时,我得到了7个字符。 - Teocci
方法 getBytes 现在已经过时。 - D.A.H

15

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

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

方法 getBytes 现在已经过时。 - D.A.H

11
你可以使用String.getBytes()方法来返回byte[]数组。

8
你可以尝试使用以下代码:return new String(byteout.toByteArray(Charset.forName("UTF-8")))。它可以将字节数组转换为字符串并指定字符集为UTF-8。

3
感谢您展示了从字节到字符串的另一种方法。 - Trismegistos

0

我知道我来晚了,但这个东西非常好用(我们的教授给了我们)。

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
    }

2
这个程序解码十六进制编码的字节数组。与这个问题所涉及的内容非常不同。 - Palec

-1

不需要将Java作为字符串参数进行更改。您需要更改C代码以接收没有指针的字符串并在其代码中使用:

Bool DmgrGetVersion (String szVersion);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接