2013-08-27 47 views
20

我正在检查两个字节数组的相等性,并且我想要一些帮助,因为即使数组应该相等,我所返回的值也是false。检查两个字节数组的相等性

在我的调试中,我可以看到a1和b1都是平等的,但它不会在while循环内部增加i。

public bool Equality(byte[] a1, byte[] b1) 
{ 
    int i; 
    bool bEqual; 
    if (a1.Length == b1.Length) 
    { 
     i = 0; 
     while ((i < a1.Length) && (a1[i]==b1[i])) 
     { 
      i++; 
     } 

     if (i == a1.Length) 
     { 
      bEqual = true; 
     } 
    } 
    return bEqual; 
} 

总是返回false:(a1[i]==b1[i])

+5

您的退货声明在哪里? – Moop

+0

hashB应该是b1吗? –

+0

据我可以告诉它不会返回任何东西 –

回答

31

您需要在某处添加返回值。这应该工作:

public bool Equality(byte[] a1, byte[] b1) 
{ 
    int i; 
    if (a1.Length == b1.Length) 
    { 
     i = 0; 
     while (i < a1.Length && (a1[i]==b1[i])) //Earlier it was a1[i]!=b1[i] 
     { 
      i++; 
     } 
     if (i == a1.Length) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

但是,这是更简单:

return a1.SequenceEqual(b1); 

或者,你可以使用IStructuralEquatable从.NET 4:

return ((IStructuralEquatable)a1).Equals(b1, StructuralComparisons.StructuralEqualityComparer) 
+0

我正在使用它来比较两个不同的文件,并返回差异(添加或删除了哪些记录),而不是它运行并正常循环我没有得到关于一个文件有记录删除的文件的差异的返回消息 – Masriyah

+0

@Masriyah所以你真正想做的是实现一个差异算法?这与简单地检查平等是完全不同的任务。我建议你看看Google的[diff-match-patch](https://code.google.com/p/google-diff-match-patch/)库。 –

+0

我继续并上传了与此相关的代码的其他部分。也许你可以看看并指出一些东西。我一整天都在这个圈子里跑来跑去。谢谢 – Masriyah

1

这应该工作:

public bool Equality(byte[] a1, byte[] b1) 
{ 
    if(a1 == null || b1 == null) 
     return false; 
    int length = a1.Length; 
    if(b1.Length != length) 
     return false; 
    while(length >0) { 
     length--; 
     if(a1[length] != b1[length]) 
      return false;   
    } 
    return true;   
} 
0

您应该添加一些return语句:

public bool Equality(byte[] a1, byte[] b1) 
{ 
    int i = 0; 
    if (a1.Length == b1.Length) 
    { 
     while ((i < a1.Length) && (a1[i]==b1[i])) 
     { 
      i++; 
     } 
    } 
    return i == a1.Length; 
} 

或者,更好的

public bool Equality(byte[] a1, byte[] b1) 
{ 
    if(a1.Length != b1.Length) 
    { 
     return false; 
    } 

    for (int i = 0; i < a1.Length; i++) 
    { 
     if (a1[i] != b1[i]) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
+1

你的第二个答案可能会抛出一个IndexOutOfBounds异常 – Moop

+1

首先进行长度检查,它比较便宜。 –

+2

第一个不会工作,因为如果'a1.Length == 0'和'b1.Length> 0' –

30

要检查平等,你可以这样写:

var areEqual = a1.SequenceEqual(b1); 
+1

技术上需要LINQ可能不符合他的框架 – Moop

+8

但是,如果它匹配他的框架,这是一个更好的方法做到这一点。 –

+1

@Moop Linq已经存在了6年,现在大多数人已经升级到至少3.5。 – Magnus

3

我推荐一些短路以使事情更简单一些,并使用object.ReferenceEquals短路的情况下,当阵列是相同的参考(a1 = b1):

public bool Equality(byte[] a1, byte[] b1) 
{ 
    // If not same length, done 
    if (a1.Length != b1.Length) 
    { 
     return false; 
    } 

    // If they are the same object, done 
    if (object.ReferenceEquals(a1,b1)) 
    { 
     return true; 
    } 

    // Loop all values and compare 
    for (int i = 0; i < a1.Length; i++) 
    { 
     if (a1[i] != b1[i]) 
     { 
      return false; 
     } 
    } 

    // If we got here, equal 
    return true; 
}