我正在尝试读取存储在字节数组中的数据,这是根据我正在处理的项目的似乎API文档。我习惯于处理字节数组,但我不确定如何查看或看到字节内的位。
中的页面它声明" IIN"值为24位长,从字节编号2位编号7开始,到字节编号4和位0结束。如何选择此数据并将其存储在变量中?以下扩展方法是否可以实现?
public static int GetSubBitsValue(this byte[] all, int startbyte, int startbit, int endbyte, int endbit)
{
//magic here
}
答案 0 :(得分:1)
一个字节包含8位。比特用2的幂来编号,因此它们从最高有效位到最低有效位从7到0。因此:
byte myByte = SomeFunctionToGetAByte();
bool isBit7Set = myByte & (2 ^ 7);
bool isBit6Set = myByte & (2 ^ 6);
bool isBit5Set = myByte & (2 ^ 5);
bool isBit4Set = myByte & (2 ^ 4);
bool isBit3Set = myByte & (2 ^ 3);
bool isBit2Set = myByte & (2 ^ 2);
bool isBit1Set = myByte & (2 ^ 1);
bool isBit0Set = myByte & (2 ^ 0);
由于此值从第7位开始并在第0位结束,因此它恰好落在字节边界上,因此它应该很容易获得。
由于它是24位长,因此需要读取3个字节(24位÷每字节8位= 3个字节)。但是你需要知道字节的顺序 - 首先是最重要的数字,这是你手工编写的方式,并且在Mac / 68000架构中很常见;或者最低有效位数,这在Wintel架构中很常见。文档必须告诉你。
假设您在数组中拥有完整的字节数组。
byte[] bytes = GetByteArray();
你需要获取所有三个字节,将其中一个移位8位(或将其乘以2 ^ 8或256),将另一个左移16位(乘以2 ^ 16或65536),然后再加上所有三个up(或OR,它们将产生相同的结果)。
如果格式为Big Endian(MSB优先),则值为
int value = bytes[2] << 16 | bytes[3] << 8 | bytes[4];
如果它是小端(LSB优先)那么它是:
int value = bytes[4] << 16 | bytes[3] << 8 | bytes[2];
答案 1 :(得分:0)
一旦选择了字节,我会使用以下内容:
bool myBit = (inputByte & (2 ^ 7)) == (2 ^ 7);