【问题标题】:Byte to Integer and then to String conversion in Java字节到整数,然后在 Java 中转换为字符串
【发布时间】:2016-04-08 04:41:50
【问题描述】:

我得到了一个用 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] &amp; 0xff 将字节转换为 32 位长度的整数,并将字节复制到整数的最低有效字节:

What does value & 0xff do in Java?

但是我无法理解上述代码第 4 行括号中的 + 0x100, 16 做了什么。感谢您的帮助。

【问题讨论】:

    标签: java integer byte tostring


    【解决方案1】:

    崩溃Integer.toString((bytes[i] &amp; 0xff) + 0x100, 16).substring(1):

    • 添加0x100(十进制为256)将第9位设置为1,这保证了结果的二进制数表示正好有9位。你可以等效地做&amp; 0x100。
    • 设置位 8 后,toString() 的结果将是 9 个字符长(零和一)。
    • substring(1) 有效地忽略第 8 位并输出低 8 位

    那又怎样?

    此代码将前导零放在值上,因此所有值都是 8 个二进制字符。没有办法让Integer.toString() 单独做到这一点。

    【讨论】:

    • 谢谢,那是什么,16?
    • 16 是 radix - 即基数 16,它是十六进制。该代码基本上将1 输出为"01" 而不是"1"
    • 谢谢。我还在论坛上找到了一种更简单的方法:sb.append(String.format("%02X", bytes[i]));
    • @nann 是的,使用格式是首选方式,但您没有询问更好的方式;你问“这段代码是什么意思”。
    • 你是对的。我只是想为以后可能阅读此主题的人提一下。再次感谢。
    猜你喜欢
    • 2019-10-16
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多