2016-04-08 138 views
1

我得到了一個用於Java中MD5哈希生成的代碼。它產生在字節數組「字節」的散列,然後轉換爲整數,然後字符串如下:字節轉換爲整數,然後轉換爲Java中的字符串轉換

byte[] bytes=md.digest(textToHash.getBytes()); 

StringBuilder sb=new StringBuilder(); 
for(int i=0;i<bytes.length;i++) 
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); 

予理解的是,bytes[i] & 0xff字節轉換成32位的長度複製該字節到的至少顯著字節的整數整數:

What does value & 0xff do in Java?

但是我不明白+ 0x100, 16在上面的代碼中的第4行確實在括號中。感謝您的幫助。

回答

1

打破Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)

  • 添加0x100(這是十進制256)設置的第9位至1,這保證了結果的二進制數表示恰好具有9位。你可以等效地做& 0x100
  • 設置第8位後,toString()的結果將爲9個字符長(零和1)。
  • substring(1)有效地忽略位8和輸出低8位

還等什麼?

該代碼在值上放置前導零,因此所有值都恰好是8個二進制字符。沒有辦法讓Integer.toString()獨自做到這一點。

+0

謝謝,但最新是什麼,16? –

+0

'16'是*基數* - 即16進制,即十六進制。該代碼基本上輸出'1'作爲'「01」'而不是''1'' – Bohemian

+0

謝謝。我還在論壇上找到了一個更簡單的方法:sb.append(String.format(「%02X」,bytes [i])); –

相關問題