2013-08-27 48 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; 
}