java unicode byte[]转成字符串String
原创
©著作权归作者所有:来自51CTO博客作者friendan的原创作品,请联系作者获取转载授权,否则将追究法律责任
一次在解密某个加密字符串时,解密结果是个unicode字符串,解密接口封装成了DLL,
java调用解密接口时,通过byte[]数组接收解密后的数据
byte[] dstBuf = new byte[1024]; // ...
如下图,一个unicode字符占2个字节空间,因为都是英文字符,
所以看到dstBuf奇数下标位置1、3、5、7、9...里面的值都是0,
所以可以确定dstBuf是个unicode字符串表示的字节数组
一开始我这样转换:
String decData = new String(dstBuf, "UTF-8"); // 下断点调试时,能看到decData有数据,但是后半部分是乱码
System.out.println(decData); // 输出是乱码
然后试了几种方法:
String s1 = new String(dstBuf, StandardCharsets.UTF_16); // 乱码
String s2 = new String(dstBuf, StandardCharsets.UTF_16BE); // 乱码
String s3 = new String(dstBuf, StandardCharsets.UTF_16LE); // 正常
String s4 = new String(dstBuf, StandardCharsets.UTF_8); // 乱码
System.out.println("S1=" + s1); // 乱码
System.out.println("S2=" + s2); // 乱码
System.out.println("S3=" + s3); // 正常
System.out.println("S4=" + s4); // 乱码
发现:
String s3 = new String(dstBuf, StandardCharsets.UTF_16LE); 可以使用,那就它了。。。
知道了原理,还是自己写个函数处理了:
public static String UnicodeByteToStr(byte[] bBuf){
// return new String(bBuf, StandardCharsets.UTF_16LE); // 这种不会处理字符串结束符 \0
StringBuffer result = new StringBuffer();
Character ch = 0;
for(int i = 0; i < bBuf.length; i += 2){
if(bBuf[i+1] == 0){
ch = (char)bBuf[i];
}
else {
ch = (char)((bBuf[i] << 8)&0xFF00 | bBuf[i+1]);
}
if(ch == 0){ // 字符串结束符 \0
break;
}
result.append(ch);
}
return result.toString();
}