【问题标题】:c# compare byte arraysc# 比较字节数组
【发布时间】:2017-04-03 11:13:23
【问题描述】:

我正在尝试使用指针比较 2 字节数组。 我将字节数组视为 int 指针以更快地运行(比较 4 个字节)。

    public static bool DoBuffersEqual(byte[] first, byte[] second)
    {
        unsafe
        {
            fixed (byte* pfirst = first, psecond = second)
            {
                int* intfirst = (int*)pfirst;
                int* intsecond = (int*)psecond;

                for (int i = 0; i < first.Length / 4; i++)
                {
                    if ((intfirst + i) != (intsecond + i))
                        return false;
                }
            }
        }
        return true;
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        byte[] arr1 = new byte[4000];
        byte[] arr2 = new byte[4000];
        for (int i = 0; i < arr1.Length; i++)
        {
            arr1[i] = 100;
            arr2[i] = 100;
        }
        bool res = DoBuffersEqual(arr1, arr2);
        Console.WriteLine(res);
    }

由于某种原因,我在调用此函数后得到 False 结果...

有人知道这里出了什么问题吗?

提前致谢!

【问题讨论】:

  • 您正在比较指针,而不是指向的值。所以:if (*(intfirst + i) != *(intsecond + i))
  • 你不会取消引用你的指针,所以你比较的是指针而不是它们指向的值。
  • @spender 哎呀......你的权利......哈哈谢谢
  • 您需要考虑的事情:这将非常适合Vector&lt;byte&gt; 和 SIMD,因此在现代 CPU 上您可以一次比较更宽的块(在我的 AVX 上 32 字节 = 256 位i7).棘手的一点是加载值 - Unsafe.Read&lt;T&gt; 是你的朋友。另外,记得检查Vector.IsHardwareAccelerated——如果是false,不要使用它;并检查 Vector&lt;byte&gt;.Count 以检查本地特定于硬件的 SIMD 支持以了解您的步幅大小。即使您不喜欢 SIMD:您仍然可以使用 long 而不是 int 来获得操作计数。

标签: c# arrays byte


【解决方案1】:

正如其他 cmets 已经说过的,问题在于您正在比较指针,而不是值。正确的代码应该是:

if (*(intfirst + i) != *(intsecond + i))

但我想指出您代码中更深层次的问题。

  • 如果输入 byte 数组的长度与 4 不一致 (first.Length % 4 != 0) 你会得到误报,因为你会 基本上吞下所有未对齐的项目:

    {1, 2, 3, 4, 5}
    {1, 2, 3, 4, 7}
    

    当它们明显不同时将返回true

  • 您应该首先检查两者 数组具有相同的长度,如果它们不具有相同的长度,则可以快速退出。你会 否则会遇到各种问题。

    {1, 2, 3, 0}
    {1, 2, 3}
    

    如果不应该返回true

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2014-10-21
    • 2013-03-25
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多