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版本,但使用不同的操作系统感到困惑.
该字符串实际上是由ImageIO库传输的图像.
这就是你出错的地方.
图像不是文本数据 - 它是二进制数据.如果您确实需要在字符串中对其进行编码,则应使用base64.我个人喜欢iharder.net上的公共域base64编码器/解码器.
这不仅适用于图像 - 对于所有二进制数据都是如此,这些数据不知道是特定编码中的文本......无论是声音,电影,Word文档,加密数据等等.不要只是像对待它一样对待它只是编码文本 - 这是一个灾难的食谱.