我有以下代码:
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());
这在Ubuntu上打印出两个不同的值; 157004和147549,但OS X上的值相同。此字符串实际上是由ImageIO库传输的图像。因此,在OS X上我能够将字符串解码为图像就好了,但在Ubuntu上我无法做到。
我在OS X上使用的是版本1.6.0_45,并且在Ubuntu上尝试了相同的版本,以及Oracle jdk 7和默认的openjdk。
我注意到我可以通过使用Latin-1解码来获得字符串长度等于字节数组长度:
String pkt = new String(b,"ISO-8859-1");
然而,这不能解码图像,理解正在发生的事情可能很困难,因为字符串对我来说就像垃圾一样。
我对使用相同的jdk版本但使用不同的操作系统这一事实感到困惑。
答案 0 :(得分:7)
此字符串实际上是由ImageIO库传输的图像。
这就是你出错的地方。
图像不文本数据 - 它是二进制数据。如果您确实需要在字符串中对其进行编码,则应使用base64。我个人喜欢public domain base64 encoder/decoder at iharder.net。
这不仅适用于图像 - 对于所有二进制数据都是如此,这些数据不知道是特定编码中的文本...是否是声音,电影,Word文档,加密数据等等。永远不要只把它当作编码文本来对待它 - 这是灾难的秘诀。
答案 1 :(得分:0)
Ubuntu默认使用utf-8,这是一个可变长度编码,因此字符串和字节数据的长度不同。这是差异的根源,但对于解决方案,我推迟了Jon的回答。