2012-01-30 65 views
1

Hy guys!Java SHA-1散列無符號BYTE

我有以下問題: 我需要散列一個Java中的無符號字節,它是(將...)在0-255之間。 主要的問題是,java沒有一個無符號的字節類型。 我找到了解決方法,並使用int而不是字節進行一些修改。

主要問題是:Java.securitys Messagedigest.digest函數只接受字節數組類型,但我需要給它一個int數組。

有人對此有一個簡單的解決方法? 我正在尋找第三方sha-1功能,但沒有找到任何。也沒有任何示例代碼。

所以基本上我所需要的: 我有例如一個無符號字節值0xFF和需要得到下列SHA1哈希:85e53271e14006f0265921d02d4d736cdc580b0b

任何幫助,將不勝感激。

回答

2

重要的是要明白,簽名和無符號字節之間沒有區別表示。簽名是關於如何通過算術運算處理字節(除了加法和減法,在2的補碼錶示的情況下)。

所以,如果你使用byte S代表數據存儲,所有你需要的是確保你把他們當作無符號的轉換值byte秒(使用明確的轉換與(byte),1點),並從byte■當(防止符號擴展與& 0xff,2點):

public static void main(String[] args) throws Exception {  
    byte[] in = { (byte) 0xff }; // (1) 
    byte[] hash = MessageDigest.getInstance("SHA-1").digest(in); 
    System.out.println(toHexString(hash)); 
} 

private static String toHexString(byte[] in) { 
    StringBuilder out = new StringBuilder(in.length * 2); 
    for (byte b: in) 
     out.append(String.format("%02X", b & 0xff)); // (2) 
    return out.toString(); 
} 
+0

對於_do_符號和無符號字節之間不同的操作,您可能會發現http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/primitives/UnsignedBytes.html有用。 – 2012-01-30 18:46:34

1

摘要不會在乎的Java如何看待一個字節的標誌;它只關心字節的位模式。試試這個:

這應該打印85e53271e14006f0265921d02d4d736cdc580b0b