2012-10-19 233 views
0

我已经用C#封装了一个C++ API。该API使用表示程序设置的字节数组填充提供的内存位置。我需要得到位0来确定它的状态。这里是C++ API和使用文档:从字节数组获取第0位

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

[你有什么试过](http://whathaveyoutried.com)?获得第一个字节和位,它应该给你它的状态。 – Oded

+0

请弄清楚一半的代码没有工作,并相应地编辑问题:你有编组的问题,或者你有问题得到一个特定的位给字节数组? –

+0

究竟是什么我的问题状态...我需要bitarray bytearray [] ...编组工作正常,我不确定如何从字节数组中得到位0 .... – devHead

回答

0

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

2

你寻找最显著位或最低位显著?

通常首先引用字节中的最高有效位,并且您得到最低有效位。

尝试GetBit(bytearray[0],7)

+0

不幸的是我没有得到该代码的正确回报 – devHead

+0

+1 - 关于大多数/最低有效位的好点。对于序列中的字节也是如此... –

+0

我等待API开发人员关于最少/最多的RESP – devHead

1

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

+0

我添加了upvote,但我不认为它使这更容易(在我看来) – devHead