【问题标题】:How to convert Java String into byte[]?如何将Java字符串转换为字节[]?
【发布时间】:2022-01-18 02:26:52
【问题描述】:

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

【问题讨论】:

  • 对不起,我正在尝试将字符串转换为字节数组并返回并得到错误的结果。我会在一段时间内编辑它并回来。
  • 您的问题是String.getBytes() 确实返回了一个字节数组,但是您认为字节数组的toString() 将返回一个有用的结果是不正确的。

标签: java arrays string


【解决方案1】:

您的方法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 的给定字形的不同字节细分,具体取决于所选的字符集。

【讨论】:

  • string.getBytes("UTF-8") 需要处理 UnsupportedEncodingException,而 string.getBytes(Charset.forName("UTF-8")) 不需要。关于哪种方法“更好”的争论我留给读者作为练习。
  • string.getBytes(StandardCharsets.UTF_8)也可以用,和string.getBytes(Charset.forName("UTF-8"))一样
  • 我相信 StandardCharsets 是 Java 7 的新成员
  • 我不明白为什么这个答案会得到如此多的支持。这可能是正确的,但它不是很有帮助......只是几行代码,其中大部分 OP 已经有了,并没有解释 Charset.forName("UTF-8") 有什么不同或为什么它很重要。
  • @LarsH 你说得很好。老实说,我没想到这个答案会如此受欢迎。我现在已经扩展了答案,以便“值得”投票。希望这是一个改进。
【解决方案2】:
  String example = "Convert Java String";
  byte[] bytes = example.getBytes();

【讨论】:

【解决方案3】:

简单地说:

String abc="abcdefghight";

byte[] b = abc.getBytes();

【讨论】:

  • 如果 abc 包含非 US-ASCII 字符,如 "greater than 2³² − 1" 或仅包含二进制数据(如“�A���b2”)怎么办?
  • 这不适用于像 这样的字符,这个字符串只有 5 个字符。但是,当我使用 getBytes() 时,我得到了 7 个字符。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    您可以使用返回byte[] 数组的String.getBytes()

    【讨论】:

      【解决方案6】:

      你可能想试试return new String(byteout.toByteArray(Charset.forName("UTF-8")))

      【讨论】:

      • 感谢您展示从字节到字符串的其他方式。
      【解决方案7】:

      没有必要将 java 更改为 String 参数。您必须更改 c 代码以在其代码中接收不带指针的字符串:

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

      【讨论】:

        【解决方案8】:

        我知道我参加晚会有点晚了,但这很好用(我们的教授给了我们)

        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
            }
        

        【讨论】:

        • 这会解码十六进制编码的字节数组。与这个问题的内容非常不同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-01
        相关资源
        最近更新 更多