java计算md5值-为什么要把结果转为16进制的字符串?
2016-02-19 10:37
981 查看
为什么算出的md5值用byte表示不行,大家都要转成16进制呢?
我们先来看一个网上找到的用java计算的简单的md5程序
输出结果的时候还需要函数将messageDigest.digest()返回的byte[]进行转化,若不进行转化,将会输出什么呢
[B@1363fb3
我试了很多不同输入,结果都是这样,求教可怜
回到题目,之所以要转化为16进制,是因为byte[]中,每个元素都占8个二进制位,每个位都有两种可能,于是16进制中每两位对应byte中的一位。比如byte中第3位的值为1,那么这一位的值就会转成16进制中的5了
上面程序执行这个对应的是
其实直接用byte类型的数也可以唯一标识一个md5值,但是你会发现有负数。。。其实表示的类型不是非要16进制的,但是这是主流做法,相信有些地方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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树