数据包的转换

无经验的人看到上面这个协议是不是懵逼,作者也懵逼 。

下面我们重点说说设备id 这个数据包  包总长16个bit ,前面12位位设备id ,后4位为 设备识别码  

假设 设备id 为值为:1 识别码值为:2

那么在java 里首先要定义一个能放下16bit 位的数据类型short 刚好占用2个byte 16个bit 位

定义一个short 类型的变量 

#设备id 16进制

short ids = 0x1      二进制  0000 0000 0000 0001

short code  = 0x2  二进制  0000 0000 0000 0010

 

short 占用16个bit 位 用

aaaa  bbbb  cccc  dddd

那么把0x1 转位二进制 那么就是 

 

找出我们感兴趣的数据就是 需要位5的到需要位16 的数据  一共有12bit ,我们都知道一个byte 只有8bit 位 那么一个byte 很

显然放不下 所以需要把后4个bit 放放到第2个byte 位的高4位

那么第一个byte 位的数据是从5-12 的数据 怎么获取  ?

获取  把二进制数向右移动4位

右移以后原来在最右边的0001 以已经被移除了,这个时候需要位9-16的数据就是第一个byte 的数据

在java 里面对应代码为 byte a= (byte)(ids>>4) 这里的byte 就为第一个byte 所需要的数据了。注意在java里类型转换

short 向byte 强制转换 将直接砍掉 高位数据保留低位数据 因此 a 里的二进制数据就是 右移后的序号 9-16 的数据。

注意:我们这里右移了4位并不代表该数据不重要而是因为该数据应该放到下一个byte数据的高4位  (注意这句话)

 

设备识别码 ,根据文档说明值暂用4个bit位 那么 只需要取出 code 低4的位数行了  怎么取?

先将code 转为2进制 

其中需要14-16 的数据是我们需要的 用(&)与运算 ,与运算规则 同位为1则为1

 

在Java里直使用   byte c = (byte)(code&0xf); 这里的c就是序号13-16 里的值了。这就取出了低4位。

注意在java里类型转换

short 向byte 强制转换 将直接砍掉 高位数据保留低位数据 因此 c 里的二进制数据就是 序号13-16的数据。

 

到此我们分别活得了变量a,c   这两个变量的数据加一起才有12 位并没有达到我们文档要求的16 bit。还差4个bit 数据在哪里?

-------------------------------------------------------------------------------------------------------

还计得这句话么

注意:我们这里右移了4位并不代表该数据不重要而是因为该数据应该放到下一个byte数据的高4位  (注意这句话)”这里是重点。 

我们在左ids 右移的时候移除了 0001, 这个被移除的数据 ,其实是第二byte 数据的高4位

那么我们需要找个变量把这个数据存起来 。

定义一个byte b =(byte)(ids<<4);    即可

注意 ids左移动4位 把高4位的数据 移除区去了,也就是需要1-4 里的数据被移除了

 

 那么一位一个数据就是 0000 0000 0001 xxxx  由于short占用16个bit 不足16bit 在末尾补0几个我这里用xxxx 代替方便说明问

接下来  short 强制类型转换位byte 那么砍掉 高8位数据 得到的byte  数据就是 

0001 0000  这里0001 就是第二个byte 的前4个bit 位数据了。

合并数据

把b和c 的数据进行合并。 怎么和  或(|)运算 预算规则1位为1既为1 那么得到

b=b|c

 

b 值   0001 0000 

c 值   0000  0010

----------------------------

        0001  0010

 

 

 

 把b转换为16进制为12 

 把a转换为16进制为 0

 那么根据协议文档构造 数据包 

fffe 00 12  20 00 00 00

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值