java截取byte中的n位

在公司的项目中定了一份协议,使用byte数组来传输协议数据,通常一个byte里不同的位代表着不同的数据,工作中,需要将我们想要的数据从一个byte中截取出来,特意在这里记录一下。若是有什么不足和错误请指出。

假设有这么一个byte数据b1:

1 1 0 1 1 0 1 1

假设我们需要从中获取其中的3~5位,即110,我们取出的正确的数值应该是这样的:

0 0 0 0 0 1 1 0

截取过程为右移两位,高位补0

0 0 1 1 0 1 1 0

再和00000111进行与运算,就能得出想要的数据,java中表示为(b1>>2)&0x07。

假如获取的数值是低位的连续几位,不用进行移位,直接与运算,如取出低四位00001011,直接将b1和00001111进行与运算,java表示为b1&0x0F;

假如取出的是高几位,需要右移再进行与运算,如取出高四位,将b1右移四位再和00001111进行与运算,java表示为(b1>>4)&0x0F。

在项目中还遇到一种特殊情况,就是一个byte不够用,需要另外的byte取出几位一起表示,那么这种情况又如何正确取出来?

假设b1还是

1 1 0 1 1 0 1 1

现在表示的数据要加入b2表示,b2为:

0 1 1 1 0 1 0 1

将b1,b2标红的位合成一个数值b3,b1作为b3的低位,b2的低两位作为b3的高两位,现在的目的就是要取出b3。b3应该是这样:

0 1 1 1 0 1 1 0 1 1

b1取全值,直接与上0xFF,按照上面的方法b2取出低两位是,b2&0x03,这样b2取出是00000001,b2在b3中表示的应该是0100000000,所以b2取出的值还要左移8位,所以整个b3表示的值为b1&0xFF+(b2&0x03)<<8。

 

 

你可能感兴趣的:(Android)