您的位置:首页 > 编程语言 > Java开发

java计算md5值-为什么要把结果转为16进制的字符串?

2016-02-19 10:37 981 查看
为什么算出的md5值用byte表示不行,大家都要转成16进制呢?

我们先来看一个网上找到的用java计算的简单的md5程序

import java.security.*;

class md5_test {
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
public static void main(String[] args) {
try {
String s = "lloasdfawealllac";
MessageDigest messageDigest= MessageDigest.getInstance("MD5");
System.out.println(byteArrayToHexString(messageDigest.digest(s.getBytes()))); //留意这一句话
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) n = 256 + n;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
}


输出结果的时候还需要函数将messageDigest.digest()返回的byte[]进行转化,若不进行转化,将会输出什么呢

[B@1363fb3

我试了很多不同输入,结果都是这样,求教可怜

回到题目,之所以要转化为16进制,是因为byte[]中,每个元素都占8个二进制位,每个位都有两种可能,于是16进制中每两位对应byte中的一位。比如byte中第3位的值为1,那么这一位的值就会转成16进制中的5了

上面程序执行这个对应的是

return hexDigits[d1] + hexDigits[d2];


其实直接用byte类型的数也可以唯一标识一个md5值,但是你会发现有负数。。。其实表示的类型不是非要16进制的,但是这是主流做法,相信有些地方16进制是方便的选择
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java md5 16进制