Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自侧字节数组的位信息_C#_.net - Fatal编程技术网

C# 来自侧字节数组的位信息

C# 来自侧字节数组的位信息,c#,.net,C#,.net,我正试图读取存储在字节数组中的数据,正如我正在从事的一个项目的API文档所示。我习惯于处理字节数组,但我不知道如何查看或检测字节中的位 此图像来自文档中的一个页面 它表示IIN值为24位,从字节号2第7位开始,到字节号4和第0位结束。如何选择此数据并将其存储在变量中?以下扩展方法是否可行 public static int GetSubBitsValue(this byte[] all, int startbyte, int startbit, int endbyte, int

我正试图读取存储在字节数组中的数据,正如我正在从事的一个项目的API文档所示。我习惯于处理字节数组,但我不知道如何查看或检测字节中的位

此图像来自文档中的一个页面

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

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

一个字节包含8位。位按二的幂进行编号,因此它们从最高有效位到最低有效位从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,然后将所有三个字节相加或或相加,结果相同

如果格式为MSB first,则值将为

int value = bytes[2] << 16 | bytes[3] << 8 | bytes[4];
如果首先是little endian LSB,那么它是:

int value = bytes[4] << 16 | bytes[3] << 8 | bytes[2];

选择字节后,我将使用以下命令:

bool myBit = (inputByte & (2 ^ 7)) == (2 ^ 7);
.NET int只能包含31位加一个符号位。一个单位可以容纳32人。也许为了获得最大容量,扩展方法可以返回一个ulong,该ulong将容纳64位,最多可使用8个字节。