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