我在Java中获得了MD5哈希生成的代码。它以字节数组“bytes”生成散列,然后转换为整数,然后转换为字符串,如下所示:
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?
但是我无法理解上面代码第4行括号中+ 0x100, 16
的作用。感谢您的帮助。
答案 0 :(得分:1)
分解Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)
:
0x100
(十进制256)将第9位设置为1
,这可以保证结果的二进制数表示恰好为9位。您可以等效地& 0x100
。toString()
的结果将是9个字符长(零和1)。substring(1)
实际上忽略了第8位并输出低8位那又怎样?
此代码在值上放置前导零,因此所有值都是8个二进制字符。没有办法让Integer.toString()
单独做到这一点。