4

byte[]の部分を効率的に比較したいのでmemcmp()、使用する必要があることを理解しています。

PInvokeを使用して呼び出すことができることを知っています-.NETでの2バイト配列のmemcmp()比較

byte[]しかし、オフセットを使用して-の一部のみを比較したいのですが、memcmp()ポインターを使用しているため、オフセットを使用したものはありません。

int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
  // Somehow call memcmp(&buffer1+offset1, &buffer2+offset2, count)
}

それを行うにはC++/ CLIを使用する必要がありますか?

IntPtrでPInvokeを使用する必要がありますか?どのように?

ありがとうございました。

4

5 に答える 5

14
[DllImport("msvcrt.dll")]
private static extern unsafe int memcmp(byte* b1, byte* b2, int count);

public static unsafe int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
    fixed (byte* b1 = buffer1, b2 = buffer2)
    {
        return memcmp(b1 + offset1, b2 + offset2, count);
    }
}

パラメータの検証を追加することもできます。

于 2010-09-15T13:42:07.330 に答える
5

C ++ / CLIは間違いなく最もクリーンですが、C ++ / CLIをまだ使用していない場合は、プロジェクトに追加することはほとんど正当化されません。

Marshal.UnsafeAddrOfPinnedArrayElement(配列、オフセット)はどうですか?

于 2010-06-09T02:48:01.787 に答える
3

何をするにしても、指定されたバイト配列に対してオフセット/カウント値が有効であることを確認する必要があります。forそれを行った後、C# でループを実行するだけで、Win32 メソッドの P/Invoking よりも遅くなることがわかりません。P/Invoke には多くのオーバーヘッドがあり、無駄になるようです。

また、常に安全でない C# があります。

すべてのパフォーマンスに関する質問と同様に、独自のパフォーマンス テストを行う必要があります。しかし、時期尚早にパフォーマンスを最適化しようとしているように思えます。

于 2010-06-08T20:36:25.590 に答える
2

C ++/CLIでP/Invokeする必要はありません。pin_ptr<>を使用してアレイを固定します。これでバイト*が得られます。オフセットを追加するだけです。

于 2010-06-08T20:32:57.497 に答える