Java将字符串字节转换为可读字符串

4

可能的重复:
Java字节数组转换为字符串再转换为字节数组

我有一个名为READ()的方法,接受一个字符串参数。这个字符串已经被转换成字节了。我想把它转换成可读的字符串。

public static String READ(final String data) throws UnsupportedEncodingException{
   char[] temp = data.toCharArray();
   byte[] bytes = new byte[temp.length];
   int i = 0;
        
   for(char c : temp){
      bytes[i++] = (byte)c;
   }
        
   return new String(bytes, "UTF-8");
}

public static String SEND(String data) throws UnsupportedEncodingException{
   return data.getBytes()+"";
}

测试:

String msg = "testing !";
String msgBytes = null;
   try {
        msgBytes = SEND(msg);
   } catch (UnsupportedEncodingException e2) {
        e2.printStackTrace();
   }
        
   System.out.println( "SEND: " + msgBytes);
   try {
         System.out.println("RECEIVE: " + READ(msgBytes));
   } catch (UnsupportedEncodingException e2) {
            e2.printStackTrace();
   }

输出结果如下:

发送:[B@452467ec

接收:[B@452467ec

2个回答

2

String有一个以byte[]为参数的构造函数。

String(byte[] bytes) -- 通过使用平台默认字符集解码指定的字节数组构造一个新的字符串。

String(byte[] bytes, Charset charset) -- 通过使用指定的字符集解码指定的字节数组构造一个新的字符串。

因此,像这样打印:

System.out.println(new String(msgBytes, "UTF-8"));

您当前看到的是默认的Object.toString(),它打印字节数组的内存引用(所有数组都从Object继承)。

我知道,但问题在于READ()接受的是像这样的字符串:"[B@452467ec",而这不是一个字节数组,它是一个字符串。我想要的只是将其转换为可读的字符串,我希望输出为"testing!" - Zbarcea Christian
1
如果READ收到了该字符串化引用,它无法将其转换回可读字符串。该字符串仅表示“地址为0x452467ec的字节数组”,此时您已经失去了所有其他信息。您需要修复发送该字符串到READ的任何内容。 - Chuck Adams
我使用Eclipse RCP制作了一个聊天应用程序。我使用SEND()方法发送一块字节(该方法将字符串转换为字节数组)到客户端/服务器。当我在客户端/服务器端读取流时,我读到的是“[B@452467ec”。这就是我想要转换回字符串的内容。 - Zbarcea Christian
1
[B@452467ec 是一个字节数组,当你打印它时,它会调用 Object.toString() 方法并输出字节数组的内存引用。请尝试运行我的示例。 - Mirko Adari
1
正如我刚才所说,将数组的默认字符串表示(即Object.toString())转换回字符串是不可能的。客户端行为不当,必须进行修复。在客户端上放置对“new String(array,charset)”的调用(永远不要使用new String的单参数形式)。 - Chuck Adams
现在我明白了... "[B@452467ec" 只是一个引用。我无法在服务器端读取它,因为它不存在! - Zbarcea Christian

1
你打印了一个 byte[],它是一个 Object,所以它只会打印该 Object 的内存引用,因为这是 toString() 的默认实现方式。

你应该直接打印 String。不要打印其 byte[] 表示。

你的代码中所做的是错误地将 String 转换为 byte[],然后再转回 String


好的,我应该如何将它转换为可读的字符串? - Zbarcea Christian
1
String msg = "testing !"; 难道 "testing !" 不够易读吗? - Dan D.

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