(オフセット付き)] [バイトの2つの部分に)(memcmpを呼び出す方法?

StackOverflow https://stackoverflow.com/questions/3000803

質問

私は効率的byte[]の部分を比較したい - 。私はmemcmp()を使用する必要があります理解して

私は、コールmemcmp()へのPInvokeを使用することができます知っている - .NETで2つのバイト配列を比較します

しかし、私はbyte[]の部分だけを比較したい - 使用するには、オフセット、そしてそれは、ポインタを使用するためのオフセットで何memcmp()はありません。

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

万一Iの使用C ++ / CLIはそれを行うには?

万一私はのIntPtrでのPInvokeを使用できますか?どのように?

ありがとうございます。

役に立ちましたか?

解決

C ++ / CLI間違いなくきれいなことが、あなたはすでにそれを使用していない場合。

このほとんど詰めがプロジェクトにC ++ / CLIを追加します

どのように<のhref = "http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.unsafeaddrofpinnedarrayelement(v=VS.100).aspx" のrel = "noreferrer" について> Marshal.UnsafeAddrOfPinnedArrayElement を(アレイ、オフセット)

他のヒント

[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);
    }
}

あなたはまた、いくつかのパラメータの検証を追加したい場合があります。

C ++ / CLIでのP /起動する必要はありません。 pin_ptr <>配列を固定するために使用します。あなたのバイト*、ちょうどオフセットを追加します。

を取得すること

はありませんあなたが何をするかは問題では、オフセット/カウント値が与えられたバイト配列のために有効であることを確認する必要があります。あなたがそれを行うの後、私はC#でforループは、Win32メソッドを呼び出す/ P以外の任意遅くなるだろうやってどのように表示されません。それは価値がないだろうとP /呼び出しで多くのオーバーヘッドが存在することになるように思える。

また、危険なC#は常にある。

すべてのパフォーマンスの問題と同じように、あなたはあなた自身のパフォーマンステストを行う必要があります。しかし、それはあなたが途中でパフォーマンスを最適化しようとしているように私に聞こえるます。

もう一つの方法

があります

SequenceEqual System.Linqの

から
 byte[] ByteArray1 = null;
 byte[] ByteArray2 = null;

 ByteArray1 = MyFunct1();
 ByteArray2 = MyFunct2();

 if (ByteArray1.SequenceEqual<byte>(ByteArray2))
 {
    MessageBox.Show("Same");
 }
 else
 {
   MessageBox.Show("Not Equal");
 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top