Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#比较字节数组_C#_Arrays_Byte - Fatal编程技术网

c#比较字节数组

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

我试图用指针比较2字节数组。 我将字节数组视为int指针,以加快运行速度(将4个字节放在一起比较)

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}