字符串构造函数操作系统之间的差异

cod*_*ple 1 java character-encoding

我有以下代码:

byte[] b = new byte[len]; //len is preset to 157004 in this example
//fill b with data by reading from a socket
String pkt = new String(b);
System.out.println(b.length + " " + pkt.length());
Run Code Online (Sandbox Code Playgroud)

这在Ubuntu上打印出两个不同的值; 157004和147549,但OS X上的值相同.此字符串实际上是由ImageIO库传输的图像.因此,在OS XI上能够将字符串解码为图像就好了,但是在Ubuntu上我无法做到.

我在OS X上使用版本1.6.0_45,并在Ubuntu上尝试了相同的版本,以及Oracle jdk 7和默认的openjdk.

我注意到我可以通过使用Latin-1解码来获得字符串长度等于字节数组的长度:

String pkt = new String(b,"ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)

然而,这不能解码图像,并且理解正在发生的事情可能很困难,因为字符串对我来说就像垃圾一样.

我对使用相同的jdk版本,但使用不同的操作系统感到困惑.

Jon*_*eet 7

该字符串实际上是由ImageIO库传输的图像.

这就是你出错的地方.

图像不是文本数据 - 它是二进制数据.如果您确实需要在字符串中对其进行编码,则应使用base64.我个人喜欢iharder.net上公共域base64编码器/解码器.

这不仅适用于图像 - 对于所有二进制数据都是如此,这些数据不知道是特定编码中的文本......无论是声音,电影,Word文档,加密数据等等.不要只是像对待它一样对待它只是编码文本 - 这是一个灾难的食谱.