2017-04-03 144 views
2

我想比較使用指針的2字節數組。 我將字節數組視爲int指針來更快地運行(比較4個字節)。c#比較字節數組

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); 
    } 

出於某種原因,調用此函數後我得到結果...

沒有任何人有任何的想法有什麼不對嗎?

在此先感謝!

+0

[爲兩個字節數組檢查平等(http://stackoverflow.com/questions/18472867/checking-equality-for-two-byte-arrays) – Smartis

+2

你比較指針的可能的複製,不是指向值。所以:'if(*(intfirst + i)!= *(intsecond + i))' – spender

+1

你不要取消引用你的指針,所以你比較的指針不是它們指向的值。 – Evk

回答

1

正如其他意見已經指出,問題是你是比較指針,而不是值。正確的代碼應該是:

if (*(intfirst + i) != *(intsecond + i)) 

但我想指出你的代碼中的更深層次的問題。

  • 如果輸入byte陣列具有長度不與4first.Length % 4 != 0)對準你會得到誤報,因爲你 基本上被吞噬所有錯位項目:

    {1, 2, 3, 4, 5} 
    {1, 2, 3, 4, 7} 
    

    威爾當他們顯然不相同時,返回true

  • 在執行其他任何操作之前,您應該檢查兩個 陣列的長度是否相同,如果不相同,則快速跳出。否則你會遇到所有問題。

    {1, 2, 3, 0} 
    {1, 2, 3} 
    

    當它沒有時,也會返回true