0

C ++ APIをC#でラップしました。このAPIは、提供されたメモリ位置をプログラム設定を表すバイト配列で埋めます。その状態を判断するには、ビット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ディストリビューションはリトルエンディアンなので、.Netプログラムを作成するのはおそらく安全な方法です。

于 2012-10-19T16:10:47.773 に答える
0

私のコードはすべて正しかった...APIベンダーから間違ったIDパラメーター(3番目の値)が提供されました...すべてのコメントと、Guvanteによって説明された最下位ビットから最上位ビットまでの新しい理解に感謝します。

于 2012-10-23T18:44:04.660 に答える