Java中字节转整数再转字符串的转换

3

我有一个在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位长度的整数,将字节复制到整数的最低有效字节中:

Java中的value & 0xff是什么意思?

然而,我不明白上述代码第4行括号中的+ 0x100, 16是什么意思。感谢您的帮助。

1个回答

3

分解代码Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1):

  • 添加0x100(即256十进制),将第9位设置为1,这保证了结果的二进制数表示恰好有9位。您可以等效地执行& 0x100
  • 在设置第8个位之后,toString()的结果将是9个字符长(由零和一组成)。
  • substring(1)有效地忽略了第8位并输出了较低的8位。

所以呢?

这段代码给值加上前导零,使所有值恰好为8个二进制字符。仅使用Integer.toString()无法做到这一点。


谢谢,但是那个“16”是什么意思? - narin.sri
16基数 - 即基于 16 的十六进制。该代码基本上将 1 输出为 "01" 而不是 "1" - Bohemian
谢谢。我在论坛上还找到了一种更简单的方法:sb.append(String.format("%02X", bytes[i])); - narin.sri
@nann 是的,使用 format 是首选的方式,但你没有询问更好的方法;你问的是“这段代码是什么意思”。 - Bohemian
你说得对。我只是想提一下,以便那些后来阅读这个帖子的人知道。再次感谢。 - narin.sri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接