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

来源:互联网 发布:广东工资软件改学历 编辑:程序博客网 时间:2024/06/03 23:47

为什么算出的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进制是方便的选择

0 0
原创粉丝点击