utf8和字节数组的转换

ps:int转byte只会取低八位
如228的二进制是 前面一堆0,然后11100100
转为byte就变成11100100,补码就是-128+64+32+4 = -28
Stream相关类传输时候,返回的是int,传输可能是byte数组。注意

    System.out.println(Arrays.toString("中".getBytes()));
    //[-28, -72, -83]

utf8转换工具会得到中

 
基础知识:
unicode转换为utf-8编码的规则
Unicode         UTF-8
0000-007F      0xxxxxxx
0080-07FF     110xxxxx 10xxxxxx
0800-FFFF    1110xxxx 10xxxxxx 10xxxxxx

 
如果字符对应编码值小于0x7F,则转换该为1个byte,最高位为0
(0x7F转换为二进制为111111,7个1。不会出现最高位为1,最高位为1肯定大于7F。),该字符对应的二进制替换X,不足7位前面高位加0

编码值在0080到07FF字符,会转换为2个字节,并且第一个字节以110开头,第二个字节以10开头,字符对应的编码值转换为2进制后的数据,填充X。不足位数的高位加0

编码值在0800到FFFF字符,会转换为3个字节,并且第一个字节以1110开头,后面字节以10开头,字符对应的编码值转换为2进制后的数据,填充X。不足位数的高位加0

也就是说大于07XX编码值的字符,转换为字节时,第一个字节中连续1的个数表示该字符对应字节的长度

 
转换过程
 

“中”的unicode通过查unicode编码表可知为:4E2D,
通过转换为二进制:100 1110 0010 1101。
4E2D落在了0800~ FFFF区间内,再依据前面转换规则填充x。
100 111000 101101
 

 

11100100 10111000 10101101
然后按补码
11100100 = -128+64+32+4 = -28
10111000 = -128+32+16+8 = -72
10101101 = -128+32+8+4+1 = -83

复习一下补码(按8位)
28的二进制是00011100
那么反码就是11100011
补码就是11100100

猜你喜欢

转载自www.cnblogs.com/islch/p/12724282.html