0

我在 C# 中包装了一个 C++ API。此 API 使用表示程序设置的字节数组填充提供的内存位置。我需要获取 Bit 0 来确定它的状态。这是 C++ API 和使用文档:

DECL_FOOAPIDLL DWORD WINAPI FOO_GetVal(
VOID *Val,  //pointer to memory where the data will be stored by the function
DWORD Len,  //length of Val in bytes
DWORD Id    //identification number of the parameter
);

这是我的 C# 包装器和调用(我认为是正确的):

        [DllImport(FOO_API, CharSet = CharSet.Auto)]
static public extern uint FOO_GetVal(IntPtr val, uint len, uint id);


        IntPtr Ptr = Marshal.AllocHGlobal(5);
        uint hr = NativeWrapper.FOO_GetVal(Ptr, 5, 1181);

        var byteArray = new byte[5];
        Marshal.Copy(Ptr, byteArray, 0, 5);


        Marshal.FreeHGlobal(Ptr);

我如何获得位 0?

我试过(没有成功):

bool b = GetBit(bytearray[0],0);

private bool GetBit(byte b, int bitnum)
{
    return (b & (1 << nitnum)) != 0;
}
4

3 回答 3

2

您是在寻找最高有效位还是最低有效位?

通常首先指的是字节中的最高有效位,而您得到的是最低有效位。

尝试GetBit(bytearray[0],7)

于 2012-10-19T15:44:19.570 回答
1

您应该考虑使用BitArray结构来使您的生活更轻松。从您的字节创建 BitArray,您可以检查所需的位。请记住 Guvante 指出的内容 - 这些位可能从最低有效位存储到最高有效位。Windows 和大多数 Linux 发行版都是little endian,因此对于 .Net 程序来说这可能是一个安全的选择。

于 2012-10-19T16:10:47.773 回答
0

我所有的代码都是正确的……API 供应商为我提供了不正确的 ID 参数(第三个值)……我感谢所有评论以及我对 Guvante 解释的最低到最高位的新理解。

于 2012-10-23T18:44:04.660 回答