C#从字节中获取位

C#从字节中获取位,c#,byte,bit,C#,Byte,Bit,我不知道为什么我在读取字节时会得到错误的位。我遵循了这里发现的一些指示,但它不起作用。我向您展示我的代码: byte[] byte22And23 = _packet.ReadBytes(2); DataFromGTAPackets.Packet8.ControlFlags.rightEngineSmoke = _packet.GetBit(byte22And23[0], 0); DataFromGTAPackets.Packet8.ControlFlags.leftEngineSmoke = _

我不知道为什么我在读取字节时会得到错误的位。我遵循了这里发现的一些指示,但它不起作用。我向您展示我的代码:

byte[] byte22And23 = _packet.ReadBytes(2);
DataFromGTAPackets.Packet8.ControlFlags.rightEngineSmoke = _packet.GetBit(byte22And23[0], 0);
DataFromGTAPackets.Packet8.ControlFlags.leftEngineSmoke = _packet.GetBit(byte22And23[0], 1);
DataFromGTAPackets.Packet8.ControlFlags.rightEngineFire = _packet.GetBit(byte22And23[0], 2);
DataFromGTAPackets.Packet8.ControlFlags.leftEngineFire = _packet.GetBit(byte22And23[0], 3);
DataFromGTAPackets.Packet8.ControlFlags.rightRotorFail = _packet.GetBit(byte22And23[0], 4);
DataFromGTAPackets.Packet8.ControlFlags.leftRotorFail = _packet.GetBit(byte22And23[0], 5);
etc...
public bool GetBit(字节b,整数位数)
{

bool bit=(b&(1You
GetBit
method认为位号是1…32,而不是0…31

简单测试:

bool b1 = GetBit(1, 0); // false
bool b2 = GetBit(1, 1); // true
您应该将方法更改为

public static bool GetBit(byte b, int bitNumber)
{
    bool bit = (b & (1 << bitNumber)) != 0;
    return bit;
}
但是在C派生语言(C#是C派生语言)中,我们从0开始计算,所以第一个解决方案更好(对我来说)

作为旁注:

1 << bitNumber - 1
1GetBit()的
GetBit()实现错误,您可以通过以下测试进行检查:

[TestMethod]
公共void MyTestMethod()
{
var byte22And23=新字节[]{2,0};
var sb=新的StringBuilder();
对于(int i=7;i>=0;i--)
{
var r=GetBit(字节22和23[0],i);
sb.附加((r)?“1”:“0”);
}
//结果:100000 100
Assert.AreEqual(“00000010”,sb.ToString());
}
GetBit()
中,似乎不需要
-1
,因为您正在索引位0,而不是1:

public bool GetBit(字节b,整数位数)
{
//这里不需要-1----------------

bool bit=(b&(1)如果
位号==0,你会移位多少?天哪,非常感谢你,伙计!很荣幸你建议进行单元测试:谢谢大家^^
DataFromGTAPackets.Packet8.ControlFlags.rightEngineSmoke = _packet.GetBit(byte22And23[0], 1);
1 << bitNumber - 1
1 << (bitNumber - 1)