无经验的人看到上面这个协议是不是懵逼,作者也懵逼 。
下面我们重点说说设备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