C#从字节中获取位

c#

我不知道为什么在读取我的字节时会出现错误的位。我遵循了此处找到的一些指示,但它不起作用。我给你看我的代码:

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(byte b, int bitNumber)
    {
        bool bit = (b & (1 << bitNumber - 1)) != 0;
        return bit;
    }

我的字节 22 的值为 2,它是:00000010。而我的字节 23 的值为 0。当我使用此代码读取字节 22 时,我的第三个变量 (rightEngineFire) 变得“真”(1)。它没有意义,显然是错误的。但我不知道出了什么问题。

谢谢!

回答

您的GetBit方法将位数视为 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;
}

或者你可以写:

DataFromGTAPackets.Packet8.ControlFlags.rightEngineSmoke = _packet.GetBit(byte22And23[0], 1);

但是在 C 派生语言(并且 C# 是 C 派生语言)中,我们从 0 开始计数,所以第一个解决方案更好(对我来说)。

作为旁注:

1 << bitNumber - 1

很不可读,因为大概 10 个程序员中有 9 个不知道/不记得这个表达式的意思

1 << (bitNumber - 1)

因为在运算符优先级表中-出现在 之前<<,所以当你混合运算符时你应该使用(...)明确优先级。


以上是C#从字节中获取位的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>