我试图用简单的代码转换字符串中的字节数组:
System.out.printf("%s \n", new String(b));
其中b
有此内容(以十六进制字符表示):
32d001000001000000000000246d3639653331697769736374683134633439687763796c7862796f74697167786f786c7504696e666f0000010001
如果我在Windows中运行我的代码,我会获得整个解码的String
,但是在Linux中,它似乎会被丢弃,直到空字节(00)。如果我跳过这些字节,则生成正确的String
。
如何在Linux OS中获得相同的结果? 抱歉,由于限制,我无法附加图片:'(
提前致谢!
答案 0 :(得分:3)
是的,那是因为您正在使用使用平台默认编码的构造函数将二进制数据转换为文本。它在不同平台上创建不同的字符串是完全合理的 - 尽管我怀疑你对Linux的解释“直到空字节”不正确,并且可能是由于你显示字符串的方式。
不要使用平台默认编码 - 或者如果确实想要它,请明确这样做。假设这真的是文本数据,请指定适当的编码,例如使用StandardCharsets
。
但是,如果这是任意二进制数据(例如加密或压缩的结果),那么您不应该以这种方式将其转换为字符串 - 您应该使用hex或base64转换。
答案 1 :(得分:0)
为了正确地将Byte数组转换为String格式,我们必须显式创建一个String对象并为其分配Byte数组。
String s = new String(bytes);
参考: http://www.mkyong.com/java/how-do-convert-byte-array-to-string-in-java/
答案 2 :(得分:0)
选择正确的字符集:
String s = new String(bytes," UTF-16");
或
String s = new String(bytes," EUC-JP");
https://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html