【问题标题】:What does & 0xff do And MD5 Structure?& 0xff 和 MD5 结构是做什么的?
【发布时间】:2014-11-08 09:57:00
【问题描述】:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class JavaMD5 {

    public static void main(String[] args) {
        String passwordToHash = "MyPassword123";
        String generatedPassword = null;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(passwordToHash.getBytes());
            byte[] bytes = md.digest();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bytes.length; i++) {
                sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
            }
            generatedPassword = sb.toString();

        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(generatedPassword);
    }
}

这一行是问题:

sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));

每个部分在这个结构中的作用是什么????

谢谢,很抱歉询问,因为我是 Java 新手。

【问题讨论】:

  • 这是一种确保每个字节都表示为两个十六进制数字的 hacky 方法。相当于写sb.append(String.format("%02x", bytes[i]))
  • 你如何确保它在任何地方都以相同的方式工作......就像不同系统上的字符编码可能不同。

标签: java md5


【解决方案1】:

大概大部分代码都很清楚,这里唯一对你来说是这个表达式:

(bytes[i] & 0xff) + 0x100

第一部分:

bytes[i] & 0xff

i 位置的字节加宽为int 值,位位置8-31 为0。在 Java 中,byte 数据类型是有符号整数值,因此加宽符号扩展了该值。如果没有 &amp; 0xff,大于 0x7f 的值最终会变成负的 int 值。剩下的就很明显了:它添加了 0x100,它只是打开索引 8 处的位(因为它在 (bytes[i] &amp; 0xff) 中保证为 0。然后通过调用 @987654330 将其转换为十六进制 String 值@。

首先添加 0x100 然后去掉 1 的原因(通过 substring(1) 调用完成,它将从位置 1 开始到末尾的子字符串)是为了保证最终结果中有两个十六进制数字。否则,低于 0x10 的字节值在转换为十六进制时会变成一个字符的字符串。

是否所有的性能都比:

sb.append(String.format("%02x", bytes[i]));

【讨论】:

    【解决方案2】:

    翻译成十六进制字符串的方式非常混乱。

    • &amp; 0xFF 执行二进制 AND,导致返回值介于 0 和 255 之间(无论如何都是一个字节)
    • + 0x100 在结果中添加 256 以确保结果始终为 3 位数
    • Integer.toString(src, 16) 将整数转换为螺旋为 16(十六进制)的字符串
    • 最后 .substring(1) 去掉第一个字符(第 2 步中的 1

    因此,这是一种将字节转换为始终包含 2 个字符的十六进制字符串的非常复杂且经过混淆的方法。

    【讨论】:

    • 为什么要这样做?有什么更简单的方法吗?任何在线资源匹配这个?
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多