我在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;
}
答案 0 :(得分:2)
您是在寻找最重要的位还是最不重要的位?
通常首先指的是字节中最重要的位,而你得到的是最低位。
尝试GetBit(bytearray[0],7)
答案 1 :(得分:1)
您应该考虑使用BitArray结构让您的生活更轻松。从你的字节创建BitArray,你可以检查你需要的位。记住Guvante指出的内容 - 比特可以从最不重要到最重要的存储。 Windows和大多数Linux发行版都是little endian,所以这对于制作.Net程序来说可能是一个安全的选择。
答案 2 :(得分:0)
我的所有代码都是正确的... API供应商向我提供了错误的ID参数(第3个值)...我感谢所有评论以及我对Guvante解释的最重要部分的新理解。