一次在解密某个加密字符串时,解密结果是个unicode字符串,解密接口封装成了DLL,

java调用解密接口时,通过byte[]数组接收解密后的数据

byte[] dstBuf = new byte[1024]; // ...
如下图,一个unicode字符占2个字节空间,因为都是英文字符,
所以看到dstBuf奇数下标位置1、3、5、7、9...里面的值都是0,

所以可以确定dstBuf是个unicode字符串表示的字节数组

java unicode byte[]转成字符串String_字符串

一开始我这样转换:

String decData = new String(dstBuf, "UTF-8"); //  下断点调试时,能看到decData有数据,但是后半部分是乱码
System.out.println(decData);  // 输出是乱码

java unicode byte[]转成字符串String_System_02

然后试了几种方法:

     

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();
}