三年六班的李子明同学,你妈拿了两本计算机基础在二号树上等你
2015-05-20 16:31
155 查看
用
初始化,用
方法执行MD5加密,返回的结果也是个byte数组。
然后把数组中每一个字节转换成两位的十六进制字符串,如果结果只有一位的话在前面添零补位。
结果就是一个30位长度的MD5字符串了。
但是!重点是!
为什么要用0xff来与一下b呢?
因为不这样处理的话b是正数还不要紧,是负数的话结果就不对了。
首先假设MD5结果中某一位是26,byte类型长8位,二进制形式是:
0001 1010
因为toHexString方法需要的参数是int类型,所以要把b强转成int,变成了32位,于是前24位填零补位,二进制形式是:
0000 0000 0000 0000 0000 0000 0001 1010
把参数转成十六进制,结果是:
0000001A
前面的0全部省略,结果是1A,没有问题。
但是这某一位变成了-26会怎么样呢?
负数在计算机中用正数的补码形式存储,于是把26的二进制值每一位取反再加一,结果是:
1110 0110
于是再把它强转为32位,也就是26的补码。这一转不要紧,结果成了:
1111 1111 1111 1111 1111 1111 1110 0110
蔚为大观。
这个时候再四位一转,把它转成十六进制,结果就是:
FFFFFFE6
符号变了一下,结果变得妈都不认识了。
虽然结果好像没什么问题,但是前面的一堆F可不打算直接拿来用。
于是干脆一了百了,把int值的前24位都扔了不要,用0xff,也就是:
0000 0000 0000 0000 0000 0000 1111 1111
与上它:
1111 1111 1111 1111 1111 1111 1110 0110
前24位当场就没了,真是太惨了:
0000 0000 0000 0000 0000 0000 1110 0110
这时候再转成十六进制,结果是E6,虽然跟开始的值不一样,
……
…………
但是反正也没人在乎……
MessageDigest.getInstance("md5")
初始化,用
MessageDigest.digest(byte[] input)
方法执行MD5加密,返回的结果也是个byte数组。
然后把数组中每一个字节转换成两位的十六进制字符串,如果结果只有一位的话在前面添零补位。
结果就是一个30位长度的MD5字符串了。
/** 对数据作MD5加密。 */ public static String hashUp(String src) { String hash = null; try { byte[] md5 = MessageDigest.getInstance("md5").digest(src.getBytes()); StringBuilder builder = new StringBuilder(); for (byte b : md5) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { builder.append('0'); } builder.append(hex); } hash = builder.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return hash; }
但是!重点是!
为什么要用0xff来与一下b呢?
因为不这样处理的话b是正数还不要紧,是负数的话结果就不对了。
首先假设MD5结果中某一位是26,byte类型长8位,二进制形式是:
0001 1010
因为toHexString方法需要的参数是int类型,所以要把b强转成int,变成了32位,于是前24位填零补位,二进制形式是:
0000 0000 0000 0000 0000 0000 0001 1010
把参数转成十六进制,结果是:
0000001A
前面的0全部省略,结果是1A,没有问题。
但是这某一位变成了-26会怎么样呢?
负数在计算机中用正数的补码形式存储,于是把26的二进制值每一位取反再加一,结果是:
1110 0110
于是再把它强转为32位,也就是26的补码。这一转不要紧,结果成了:
1111 1111 1111 1111 1111 1111 1110 0110
蔚为大观。
这个时候再四位一转,把它转成十六进制,结果就是:
FFFFFFE6
符号变了一下,结果变得妈都不认识了。
虽然结果好像没什么问题,但是前面的一堆F可不打算直接拿来用。
于是干脆一了百了,把int值的前24位都扔了不要,用0xff,也就是:
0000 0000 0000 0000 0000 0000 1111 1111
与上它:
1111 1111 1111 1111 1111 1111 1110 0110
前24位当场就没了,真是太惨了:
0000 0000 0000 0000 0000 0000 1110 0110
这时候再转成十六进制,结果是E6,虽然跟开始的值不一样,
……
…………
但是反正也没人在乎……
相关文章推荐
- 非计算机专业的同学,不见得也要追求计算机基础扎实
- 计算机图形学基础知识-三维变换.
- 计算机基础知识
- 【那些年学过的计算机基础】--计算机发展史(图片版)
- 全国2004年4月高等教育自学考试计算机软件基础(二)试题
- cs231n 卷积神经网络与计算机视觉 1 基础梳理与KNN图像分类
- 探秘linux-计算机基础
- linux运维第一天: 计算机基础
- 计算机网络基础——网络层
- 计算机基础知识--进程和线程01
- 计算机基础
- 计算机基础系列一:计算机硬件
- 计算机网络基础(二)
- Linux中的网络管理——计算机网络基础
- 计算机视觉基础1——视差与深度信息
- 计算机基础知识
- 计算机视觉基础2——相机成像的几何描述
- 图像处理与计算机视觉基础,经典以及最近发展
- 计算机网络基础知识总结
- 计算机基础知识--基础知识