我试图使用指针比较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 结果...
有人知道这里有什么问题吗?
提前致谢!
答案 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
。