我想比较的部分 byte[] 有效的-所以我明白 memcmp() 应该使用。

我知道我可以使用PInvoke叫 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这么做吗?

我应该使用PInvoke有因此?怎么样?

谢谢你。

有帮助吗?

解决方案

C++/CLI肯定会是最干净的,但是这几乎没有证明加入C++/CLI到项目如果你不是已经在使用它。

怎么样 元帅。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);
    }
}

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

没有必要的P / Invoke在C ++ / CLI。使用pin_ptr <>到管脚阵列。这让你一个字节*,只需添加偏移。

不管你做什么,你应该检查偏移/计数值适用于给定的字节数组。你这样做之后,我不认为只是做了如何在C#中for循环将是任何除P慢/调用一个Win32方法。好像将有大量的开销在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