Java Byte to Char转换

时间:2016-10-17 11:48:32

标签: java

我从TCP / IP套接字s中读取:

byte[] bbuf = new byte[30];
s.getInputStream().read(bbuf);
for (int i = 0; i < bbuf.length; i++)
{
     System.out.println(Integer.toHexString( (int) (bbuf[i] & 0xff)));
}

这输出CA 68 9F 75,这是我所期望的。现在我想用chars代替

char[] cbuf = new char[30];
BufferedReader input =  new BufferedReader(new InputStreamReader(s.getInputStream())); 
for (int i = 0; i < cbuf.length; i++)
{
     System.out.println(Integer.toHexString( (int) (cbuf[i] )));
}

现在输出是CA 68 178 75.所以第三个字节(只有第三个字节)有所不同。我假设它与字符集有关,我必须在InputStreamer中指定一个字符集。我不知道如何找出我必须使用的字符集。其次,我很惊讶,如果它是由于字符集,我只得到一个字符的混乱。我尝试了所有其他角色,但这似乎是我唯一能找到的角色。

谁能解开这个谜团?

3 个答案:

答案 0 :(得分:1)

你的问题是你正在将梨与苹果进行比较;字节与字符不同。在您的代码中,字符Ÿ以下列方式表示:

  • 9F(字节使用Windows-1252编码)
  • 178( char 使用UTF-16编码,这是Java总是在内部用于字符的编码)

作为我所说内容的证明,请查看:

String myString = "Caña";
byte[] bbuf = myString.getBytes();     // [ 43, 61, C3, B1, 61 ]   (UTF-8 on my machine)
char[] cbuf = myString.toCharArray();  // [ 43, 61, F1, 61 ]  (Java uses UTF-16 internally)

现在分析你的问题:

  • 您从字符串中获取了一个字节数组,我想这样做:myString.getBytes()因为您没有指定编码,系统使用您机器中的默认值(Windows-1252)< / p>

  • 当您使用InputSteanReader等将字节读入字符串时,实际上没有问题,因为您正在从另一台(或相同的)Windows机器上读取,问题是当您获得字符数组时(期望得到相同的结果(而不是字节数组)(使用myString.getBytes()而不是myString.toCharArray(),你会正确地看到你的字节。

最后,一些建议:

  • 在字符串和字节数组之间进行转换时,总是明确声明编码:

    byte[] bbuf = myString.getBytes(Charset.forName("UTF-8"));
    
    String myString = new String(bbuf, Charset.forName("UTF-8"));
    
  • 永远不要混合字符和字节,它们不是一样的

答案 1 :(得分:0)

InputStreamReader将使用character encoding将输入流中的字节转换为字符。由于您没有明确指定应该使用哪种字符编码,因此它将使用系统的默认字符编码。

如何转换字节取决于正在使用的字符编码。

如果数据是二进制数据而不表示使用某些字符编码编码的文本,那么使用InputStreamReader是读取此数据的错误方法。

另请参阅:Streams and readers/writers

答案 2 :(得分:0)

我不知道这里是否有任何副作用,但我这样做了:

buf = new String(buffer, StandardCharsets.ISO_8859_1).toCharArray();

其中“缓冲区”是我从 GZIPInputStream 读取的字节数组。 这只是对上面 Morgano 的解释的扩展。