如何在byte []的两个部分调用memcmp()(带偏移量)?

时间:2010-06-08 19:58:17

标签: c# .net c++-cli pinvoke memcmp

我想有效地比较byte[]的部分内容 - 所以我理解应该使用memcmp()

我知道我可以使用PInvoke来致电memcmp() - Comparing two byte arrays in .NET

但是,我想仅比较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吗?怎么样?

谢谢。

5 个答案:

答案 0 :(得分: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);
    }
}

您可能还想添加一些参数验证。

答案 1 :(得分:5)

C ++ / CLI肯定是最干净的,但如果你还没有使用C ++ / CLI,那么这很难证明是正确的。

Marshal.UnsafeAddrOfPinnedArrayElement(数组,偏移量)怎么样?

答案 2 :(得分:2)

无需在C ++ / CLI中进行P / Invoke。使用pin_ptr<>固定阵列。这会得到一个字节*,只需添加偏移量。

答案 3 :(得分:2)

无论您做什么,都应检查偏移/计数值是否对给定的字节数组有效。在你这样做之后,我不知道在C#中执行for循环的速度是否比P /调用Win32方法慢。似乎在P / Invoke中会有很多开销,这是不值得的。

此外,C#总是不安全。

与所有性能问题一样,您应该进行自己的性能测试。但是听起来我觉得你正试图过早地优化性能。

答案 4 :(得分:0)

还有一种方法

来自System.Linq的SequenceEqual

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

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

 if (ByteArray1.SequenceEqual<byte>(ByteArray2))
 {
    MessageBox.Show("Same");
 }
 else
 {
   MessageBox.Show("Not Equal");
 }