Java里byte[]和String转换不一致的坑

解决byte[]转成String再转成byte[]结果与期望不符合的问题

Featured image

背景

最近做Java项目时对数据做格式转换,发现踩了一个坑。

看下问题场景, 把byte[]转换成String,再转回byte[],发现结果和原来不一样:

byte[] a = {-76};
System.out.println(Arrays.toString(a));
String aStr = new String(a);
byte[] b = aStr.getBytes();
System.out.println(Arrays.toString(b));

打印出来:

[-76]
[-17, -65, -67]

竟然不一样,跟期望的完全不一样 -_-!~

看了下 String.getBytes() 带传参的方法是:

public byte[] getBytes(@RecentlyNonNull Charset charset) {
    throw new RuntimeException("Stub!");
}

咱打印下Charset默认的编码方式:

System.out.println(Charset.defaultCharset().name());

打印结果是

UTF-8

查了下资料,UTF-8是一种多位元组序列,需要用多字节来表示一个字符。

编码成字符串后,再转回byte[]就会和原来不一致。

制定一个单字节编码方式试一试

byte[] a = {-76};
System.out.println(Arrays.toString(a));
String aStr = new String(a, Charset.forName("ISO-8859-1"));
byte[] b = aStr.getBytes(Charset.forName("ISO-8859-1"));
System.out.println(Arrays.toString(b));

打印结果是

[-76]
[-76]

符合期望~