2013-07-07 108 views
0

我正在使用一個c#web服務,其中一個參數是發送一個md5散列。 Java創建帶有符號的MD5散列(在字節數組中包含負數)並且C#生成無符號數(在字節數組中不包含負數)。java如何得到unsightned md5散列

我已經經歷了多個類似的問題在stackoverflow中,但沒有找到任何令我滿意的。

我需要的是無符號字節數組,類似於一個c#生成的。我曾嘗試使用BigInteger,但我需要它在一個無符號的字節數組,因爲我需要做進一步處理之後。 BigInteger給了我一個整數,使用tobytearray()仍然有負數。

如果我必須做2補充atleast可以請一些請告訴我如何做到這一點。然後我可以循環通過字節數組並將負數轉換爲正數。

請儘快

幫助我使用下面的Java代碼生成MD5哈希

String text = "abc"; 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    byte[] md5hash = new byte[32]; 
    try { 
     md.update(text.getBytes("utf-8"), 0, text.length()); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    md5hash = md.digest(); 
+1

嗯,我看不出這可能是一個問題......而Java確實使用無符號字節,在任何情況下按位表示都是正確的... – fge

回答

5

的Java字節有符號數,但這隻意味着,在考慮一個字節(時爲一個8位的序列)作爲一個數字,Java將其中一個位視爲符號位,而其他語言讀取與無符號數相同的位序列,不包含符號位。

MD5算法是一種將比特序列(或字節)轉換爲另一比特序列(或字節)的二進制算法。 Java的做法與任何其他語言的做法相同。只有在將字節顯示爲數字時,纔會得到不同的輸出,具體取決於語言將字節轉換爲數字的方式。

所以簡單的答案是,發送一個使用Java生成的MD5哈希到C#程序,它會正常工作。

如果你想顯示在Java字節數組作爲無符號數,只需要使用下面的代碼:

for (byte b : bytes) { 
    System.out.println(b & 0xFF); 
}