byte[] --> String --> byte[] 发生失真问题的总结

(1)通讯双方都采用相同的编码,用到的也都是编码内的字符,则通讯不会发生异常。举例如下:

String s = "0中国A";

byte[] b1 = s.getBytes();

byte[] b2 = new String(b1).getBytes();

for (int i = 0; i < b1.length; i++) {

    System.out.println(b1[i] + " <-> " + b2[i]);

}

输出结果:

48 <-> 48

-28 <-> -28

-72 <-> -72

-83 <-> -83

-27 <-> -27

-101 <-> -101

-67 <-> -67

65 <-> 65

说明 相同编码,使用编码内的字符 String --> byte[] --> String --> byte[] 未出现失真现象。


(2)通讯报文内容中用到了字符编码外的字符,例如项目编码为GBK,GBK编码中不包含ascii为-5等等的一些字符编码。

故将 ascii为-5的这些byte[]转换为String时会发生失真。

例如:

byte[] b1 = new byte[10];

for (int i = 0; i < 10; i++) {

b1[i] = (byte) (i - 5);

}

byte[] b2 = new String(b1).getBytes();

for (int i = 0; i < 10; i++) {

System.out.println(b1[i] + " <-> " + b2[i]);

}

输出结果为:

-5 <-> -17

-4 <-> -65

-3 <-> -67

-2 <-> -17

-1 <-> -65

0 <-> -67

1 <-> -17

2 <-> -65

3 <-> -67

4 <-> -17

说明使用编码外的字符 byte[] --> String --> byte[] 出现失真现象。


(3)双方项目使用相同的编码(举例为GBK编码)传输中仍需要传输编码外的字符,

首先在String转byte[]时候使用ISO-8859-1编码,然后byte[]转String的时候也使用ISO-8859-1,

则不会发生失真现象,例如:

byte[] b1 = new byte[10];

for (int i = 0; i < 10; i++) {

b1[i] = (byte) (i - 5);

}

// 下面这一行,byte[] --> String --> byte[] 未发现失真。

byte[] b2 = new String(b1, "ISO-8859-1").getBytes("ISO-8859-1");

for (int i = 0; i < 10; i++) {

System.out.println(b1[i] + " <-> " + b2[i]);

}

输出结果如下:

-5 <-> -5

-4 <-> -4

-3 <-> -3

-2 <-> -2

-1 <-> -1

0 <-> 0

1 <-> 1

2 <-> 2

3 <-> 3

4 <-> 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值