Java的 byte数组 与 16进制字符串互转,关于负值的问题

在与硬件设备通信的时候,硬件传回来的数据经常是十六进制的,

在 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。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值