来自字节数组

时间:2017-01-13 22:46:41

标签: c# .net

我正在尝试读取存储在字节数组中的数据,这是根据我正在处理的项目的似乎API文档。我习惯于处理字节数组,但我不确定如何查看或看到字节内的位。

此图片来自文档enter image description here

中的页面

它声明" IIN"值为24位长,从字节编号2位编号7开始,到字节编号4和位0结束。如何选择此数据并将其存储在变量中?以下扩展方法是否可以实现?

        public static int GetSubBitsValue(this byte[] all, int startbyte, int startbit, int endbyte, int endbit)
    {
        //magic here
    }

2 个答案:

答案 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);