(オフセット付き)] [バイトの2つの部分に)(memcmpを呼び出す方法?
質問
私は効率的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");
}