2010-12-08 80 views
0

我嘗試比較2個字節數組。字節數組的比較

字節陣列1是與過去的3個字節的SHA1哈希的數組:

private static byte[] sha1SsidGetBytes(byte[] sha1) 
    { 
    return new byte[] {sha1[17], sha1[18], sha1[19]}; 
    } 

字節陣列2是我填充3個字節從十六進制字符串來的數組:

private static byte[] ssidGetBytes(String ssid) 
    { 
    BigInteger ssidBigInt = new BigInteger(ssid, 16); 

    return ssidBigInt.toByteArray(); 
    } 

這怎麼可能,這比較:

if (Arrays.equals(ssidBytes, sha1SsidGetBytes(snSha1))) 
    { 
    } 

工作的時代,但有時最不噸。字節順序?

例如對於「6451E6」(十六進制字符串)它工作正常,對於「ABED74」它不...

+1

你看過你的字節數組包含在調試器中嗎?你是否遇到了有符號字節的問題? – 2010-12-08 19:36:23

+0

如何查看它們是否已簽名? – tersmitten 2010-12-08 19:38:32

回答

1

您的基於BigInteger解析十六進制字符串的方法是有缺陷的。例如,new BigInteger("ABED74").toByteArray()返回一個數組字節,而不是三個字節。雖然你可以破解這個,但你從根本上而不是試圖做任何涉及BigInteger值...你只是想分析十六進制。

我建議你使用Apache Codec庫做解析:

byte[] array = (byte[]) new Hex().decode(text); 

(Apache的編解碼器的API極不理想的東西,但它確實工作。)

+0

那麼這將是我猜測的問題?有沒有其他方法來解析一個十六進制字符串(長度爲6)到一個3字節的數組? – tersmitten 2010-12-08 19:42:45

3

的問題是很明顯的如果你試試這個:

BigInteger b1 = new BigInteger("6451E6", 16); 
BigInteger b2 = new BigInteger("ABED74", 16); 

System.out.println(b1.toByteArray().length); 
System.out.println(b2.toByteArray().length); 

具體來說,ABED74創建一個BigInteger,其字節數組長度爲4字節 - 所以當然它不會是等於任何THR ee字節數組。

直截了當的解決方法是從

return ssidBigInt.toByteArray(); 

改變ssidGetBytes return語句來

byte[] ba = ssidBigInt.toByteArray(); 
return new byte[] { ba[ba.length - 3], ba[ba.length - 2], ba[ba.length - 1] }; 
1

Javadoc中的(重點煤礦):

http://download.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html#toByteArray%28%29

返回包含這個BigInteger的 二進制補碼錶示的 的字節數組。字節數組 處於big-endian字節順序中:最重要的字節位於第零個元素中 。該陣列將包含 所需的最小字節數,以 表示該BigInteger,包括 至少一個符號位,即 (ceil((this.bitLength()+ 1)/ 8))。 (這個表示是兼容的 與的(byte [])構造函數。)

有很多計算的ByteInteger(字符串,基數)所使用的構造,其中不保證所構造的BigInteger將產生一個字節陣列(經由其toByteArray()方法)可比較的內部運行的到String的getBytes()編碼的結果。

toByteArray的輸出()被打算用來(大部分)作爲輸入到BigInteger的(字節[])構造。它不能保證除此之外的其他用途。

看起來像這樣:toByteArray()的輸出是BigInteger對象的一個字節表示,它的所有內容都包括在內的所有內容,包括幅度等內部屬性。這些屬性不存在於輸入字符串中,但在構造BitInteger對象時計算。

這將與輸入字符串的字節表示不兼容,該字符表示僅攜帶用於創建BigInteger的初始數值。