在与硬件设备通信的时候,硬件传回来的数据经常是十六进制的,
在 0-100 的范围内 Java会自动转换成十进制的数字出来,
但如果包含abc这些字符自动转换就有问题了,可能变成负数了。
如:
设备传送的数据是:A5 5A 26 08 36 36 36 36 36 36 36 36 01 00 01 00 01 00 01 00 02 01 70 01 05 01 00 01 00 01 3E 01 05 01 05 02 04 06 98 5A A5
Java转为10进制是:byte[] bytes = {-17,-65,-67,90,38,8,54,54,54,54,54,54,54,54,1,0,1,0,1,0,1,0,2,1,112,1,5,1,0,1,0,1,62,1,5,1,5,2,23,49,-17,-65,-67,90,-17,-65,-67}
十六进制(Hex)与字节(byte)的概念
十六进制(Hex):计算机中数据的一种表示方法,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15。
1个字节(byte)= 8位(bit)
“字节数组(byte数组)” 里面全部是 “字节 (byte)”,就是每一个“字节 (byte)” 都可以用二进制、十六进制、十进制来表示,如下:
二进制:00010110 —> 0*2^8 + 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 22
十六进制:0x16 —> 1*16^1 + 6*16^0 = 22
十进制:22
所以下面三者等价:
二进制:byte [] aa = { 00010110, 01010010, 10111000 };
十六进制:byte [] aa = { 0x16, 0x52, 0xB8 };
十进制:byte [] aa = { 22, 82, 184 };
在Eclipse断点调试的时候,看到的 “ 字节数组(byte数组)” 的内容都是用 “ 十进制 ” 表示的。
有时会看到 “负数 ” ,因为 “ 字节数组(byte数组)” 中 超过127的数 都会 以负数的形式显示。
我们知道Java 读取的方式只支持 “ 字节数组(byte数组)”,而 “字节(byte)” 是8位,所以 不能超过127,如果超过就会溢出,以负数的形式显示。
转换原理:
每个二进制位有两种状态,分别为0,1
因此,两个二进制位有4种状态,分别为:00,01,10,11
三个二进制位有8种状态,分别为000,001,010,011,100,101,110,111
四个二进制位有十六种状态,0000,0001......1110,1111. 即十六进制
一个十六进制数(Hex),正好为4个二进制位。一个字节(byte)为8个二进制位。
因此,一个字节可表示为两个十六进制数字。
因此,我们可以将一个byte用两个Hex表示,同理,我们也可以将两个Hex转换为一个byte。