2016-04-08 140 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])); –

相关问题