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

发布于 2024-09-04 08:53:45 字数 600 浏览 12 评论 0原文

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

我知道我可以使用 PInvoke 调用 memcmp() - 比较.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 来做到这一点吗?

我应该将 PInvoke 与 IntPtr 一起使用吗?如何?

谢谢。

I want to compare parts of byte[] efficiently - so I understand memcmp() should be used.

I know I can using PInvoke to call memcmp() - Comparing two byte arrays in .NET

But, I want to compare only parts of the byte[] - using offset, and there is no memcmp() with offset since it uses pointers.

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

Should I use C++/CLI to do that?

Should I use PInvoke with IntPtr? How?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

单身狗的梦 2024-09-11 08:53:45
[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);
    }
}

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

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

You might also want to add some parameter validation.

塔塔猫 2024-09-11 08:53:45

C++/CLI 肯定是最干净的,但如果您尚未使用 C++/CLI,那么将其添加到您的项目中几乎没有理由。

元帅怎么样。 UnsafeAddrOfPinnedArrayElement(数组,偏移量)?

C++/CLI will definitely be the cleanest, but this hardly justifies adding C++/CLI to your project if you aren't already using it.

How about Marshal.UnsafeAddrOfPinnedArrayElement(array, offset)?

有木有妳兜一样 2024-09-11 08:53:45

无论您做什么,都应该检查偏移/计数值对于给定的字节数组是否有效。完成此操作后,我不认为在 C# 中执行 for 循环会比 P/Invoking Win32 方法慢。看起来 P/Invoke 中会有很多开销,这是不值得的。

此外,C# 始终存在不安全的情况。

与所有性能问题一样,您应该进行自己的性能测试。但在我看来,您似乎正在尝试过早地优化性能。

No matter what you do, you should check that the offset/count values are valid for the given byte arrays. After you do that, I don't see how just doing a for loop in C# is going to be any slower than P/Invoking a Win32 method. Seems like there would be a lot of overhead in the P/Invoke that it would not be worthwhile.

Also, there is always unsafe C#.

As with all performance questions, you should do your own performance testing. But it sounds to me like you are trying to optimize for performance prematurely.

心如狂蝶 2024-09-11 08:53:45

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

No need to P/Invoke in C++/CLI. Use pin_ptr<> to pin the array. That gets you a byte*, just add the offset.

此岸叶落 2024-09-11 08:53:45

还有另一种方法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");
 }

There is one more way

SequenceEqual from 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");
 }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文