&0xff做什么和MD5结构?

Ami*_* Ip 2 java md5

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这一行是问题所在:

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

每个部分在这个结构中做了什么?

谢谢,我很抱歉要求Beacuse我是java的新手.

Ted*_*opp 7

据推测,大部分代码都是清晰的,这里唯一的谜是这个表达式:

(bytes[i] & 0xff) + 0x100
Run Code Online (Sandbox Code Playgroud)

第一部分:

bytes[i] & 0xff
Run Code Online (Sandbox Code Playgroud)

加宽在位置字节iint的比特位置8-31用零值.在Java中,byte数据类型是带符号的整数值,因此扩展符号扩展了该值.如果没有& 0xff,大于0x7f的值将最终为负值int.其余的是相当明显的:它增加了0x100,它只是打开索引8处的位(因为它保证为0 in (bytes[i] & 0xff).然后String通过调用将其转换为十六进制值Integer.toString(..., 16).

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

所有这些都具有更好的性能(当然不是更清晰)是有争议的:

sb.append(String.format("%02x", bytes[i]));
Run Code Online (Sandbox Code Playgroud)