2011-03-26 113 views
77

我有一個字節數組,裏面有一個〜已知的二進制序列。我需要確認二進制序列是它應該是什麼。除了==之外,我已嘗試.equals,但都沒有工作。比較兩個字節數組? (Java)

byte[] array = new BigInteger("1111000011110001", 2).toByteArray(); 
if (new BigInteger("1111000011110001", 2).toByteArray() == array){ 
    System.out.println("the same"); 
} else { 
    System.out.println("different'"); 
} 
+0

讀取可你只是直接比較字符串? – objects 2011-03-26 02:51:52

+1

@objects - 前導零。此外,字符串/ BigInteger的東西可能只是一種說明字節數組比較問題的方式。 – 2011-03-26 03:13:27

+0

您是否嘗試過使用compareTo方法?順便說一句''==原始值進行比較僅供參考 – ChriskOlson 2014-02-13 00:48:21

回答

143

在你的榜樣,您有:

if (new BigInteger("1111000011110001", 2).toByteArray() == array) 

當對象打交道,==在java中比較參考值。您正在檢查toByteArray()返回的數組的引用是否與array中的引用相同,這當然不會成立。此外,數組類不會覆蓋.equals(),因此行爲是Object.equals(),它也只是比較參考值。

爲了比較內容兩者的陣列,由Arrays class

byte[] array = new BigInteger("1111000011110001", 2).toByteArray(); 
byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray(); 
if (Arrays.equals(array, secondArray)) 
{ 
    System.out.println("Yup, they're the same!"); 
} 
3

當然,Arrays.equal的接受的答案(字節[]第一,字節[]第二提供的靜態陣列的比較方法) 是正確的。 我喜歡在較低級別工作,但我無法找到一個低級別的高效函數來執行相等測試範圍。我不得不掀起了我自己,如果有人需要它:

public static boolean ArraysAreEquals(
byte[] first, 
int firstOffset, 
int firstLength, 
byte[] second, 
int secondOffset, 
int secondLength 
) { 
    if(firstLength != secondLength) { 
     return false; 
    } 

    for(int index = 0; index < firstLength; ++index) { 
     if(first[firstOffset+index] != second[secondOffset+index]) { 
      return false; 
     } 
    } 

    return true; 
} 
+0

這是一個很好的解決方案來測試數組的一個子集而不是整個事情。但是請注意,Arrays.equals(byte [],byte [])幾乎完成了您在此處所做的所有操作(除了更有效地處理這兩個值是相同的對象,並處理空數組傳遞的優雅)。當選擇使用標準庫實現時,社區將支持該標準庫,或者編寫一個需要永久支持的自定義實現,每次我都會選擇前者。 – 2015-08-27 21:03:19

+0

Tom Dibble說的是什麼。請以某種方式備份您的答案或將其刪除...... – 2015-10-28 08:55:02

+4

答案對於有兩個數組且需要比較其中的字節範圍而不首先製作數組副本的用例很有用。數組副本會增加開銷,增加垃圾並且不需要。我需要的是低級c風格memcmp(),這符合需要。當然,memcmp()只需要1個長度參數。這個功能足夠接近。 – Bamaco 2015-10-29 14:30:35

8

您可以同時使用Arrays.equals()MessageDigest.isEqual()。這兩種方法雖然有一些差異。

MessageDigest.isEqual()是一個時間常數比較方法,Arrays.equals()是非時間常數,如果您在安全應用程序中使用它,可能會帶來一些安全問題。

這種差異的細節可以在Arrays.equals() vs MessageDigest.isEqual()