c#比较字节数组

时间:2017-04-03 11:13:24

标签: c# arrays byte

我试图使用指针比较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 结果...

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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