c#比较字节数组
我试图用指针比较2字节数组。 我将字节数组视为int指针,以加快运行速度(将4个字节放在一起比较)c#比较字节数组,c#,arrays,byte,C#,Arrays,Byte,我试图用指针比较2字节数组。 我将字节数组视为int指针,以加快运行速度(将4个字节放在一起比较) public static bool DoBuffersEqual(字节[]第一,字节[]第二) { 不安全的 { 固定(字节*pfirst=第一,秒=第二) { int*intfirst=(int*)pffirst; int*intsecond=(int*)秒; for(int i=0;i
public static bool DoBuffersEqual(字节[]第一,字节[]第二)
{
不安全的
{
固定(字节*pfirst=第一,秒=第二)
{
int*intfirst=(int*)pffirst;
int*intsecond=(int*)秒;
for(int i=0;i
由于某种原因,调用此函数后,我得到了False结果
有人知道这里出了什么问题吗
提前谢谢 正如其他评论所述,问题在于您正在比较指针,而不是值。正确的代码应为:
if (*(intfirst + i) != *(intsecond + i))
但我想指出代码中更深层次的问题
- 如果输入的
数组的长度与字节
(4
)您将得到误报,因为您将 基本上吞下所有未对齐的项目:first.Length%4!=0
当它们明显不同时,将返回{1, 2, 3, 4, 5} {1, 2, 3, 4, 7}
true
- 在做任何事情之前,你应该先检查一下
数组具有相同的长度,如果没有,则快速跳出。你会
否则会遇到各种各样的问题
当不应返回时,也将返回{1, 2, 3, 0} {1, 2, 3}
true
if(*(intfirst+i)!=*(intsecond+i))
您没有取消对指针的引用,所以您是在比较指针而不是它们指向的值。@spender oops…您的权利。。。哈哈,谢谢你考虑的方法:这将非常适合Vector
和SIMD,因此在现代CPU上,你可以一次比较更宽的块(在我的AVX i7上,32字节=256位)。棘手的是加载值-不安全。Read
是你的朋友。另外,记得检查Vector.IsHardwareAccelerated
——如果它是false
,不要使用它;并检查Vector.Count
以检查本地硬件特定的SIMD支持,了解您的步幅大小。即使您不喜欢SIMD:也可以使用long
而不是int
来获得运算计数。
{1, 2, 3, 0}
{1, 2, 3}