将byte []转换为String然后再转换为byte []

Sid*_*Sid 7 java string bytearray

我正在研究代理服务器.我正在获取数据byte[],我将其转换为String执行某些操作.现在当我将这个新的转换Stringbyte[]它时会导致未知问题.

所以主要是因为我需要知道如何正确地将a转换byte[]为a String然后再转换为a byte[].

我试图将转换byte[]String然后再转换回来byte[](以确保它不是我的操作导致问题).

所以它就像:

// where reply is a byte[]

String str= new String(reply,0, bytesRead);
streamToClient.write(str.getBytes(), 0, bytesRead);
Run Code Online (Sandbox Code Playgroud)

不等于

streamToClient.write(reply, 0, bytesRead);
Run Code Online (Sandbox Code Playgroud)

我的代理工作正常,当我发送byte[]没有任何转换,但当我将其转换byte[]为a String然后回到byte[]它导致问题.

有人可以帮忙吗?=]

Mic*_*rdt 9

最好的方式来转换byte[]String和回一个byte[]是不要做它.

如果你有,你必须知道这是用于生产的编码byte[],否则操作使用平台的默认编码,可能会破坏数据,因为不是所有的编码可以编码所有可能的字符串,而不是所有可能的字节序列是合法的所有的编码.这就是你的情况.

至于如何找出编码,这取决于:

  • 如果您使用的是HTTP,请查看Content-Type标头
  • 如果您的数据是XML,那么您应该使用XML解析器,它将为您处理编码
  • 如果您的数据是HTML页面,则可能还有<meta http-equiv>标题

如果没有办法找出编码,你有随机垃圾,而不是文本数据.


cle*_*tus 4

您将需要知道所使用的字符编码,使用该编码解码字节并使用相同的字符编码重新编码。例如:

String str = new String(reply, 0, Charset.forName("UTF-8"));
bytes[] out = str.getBytes(Charset.forName("UTF-8"));
streamToClient.write(bytes, 0, bytes.length);
Run Code Online (Sandbox Code Playgroud)

如果未指定,Java 将使用默认字符编码,通常为 UTF-8(甚至可能强制如此),但 HTML 通常会是其他编码。我怀疑那是你的问题。

  • 默认字符编码通常不是 UTF-8,至少在 Windows 上不是。 (2认同)