代码中加密的时候 用到bytes[i] & 0xFF
MessageDigest md5 = MessageDigest.getInstance("MD5");
bytes = md5.digest(basestring.toString().getBytes("UTF-8"));
。。。。。。。。。
String hex = Integer.toHexString(bytes[i] & 0xFF);
首先你得清楚几个个概念
1.byte的取值范围
byte java 中一个字节 8位 即 -2^7—2^7-1 范围是 -128——127 (*对这个有疑问吗?在2 中解答)
2.计算机中负数的存储的值是它的补码
补码计算方法 负数取值是它的绝对值,的二进制数,取反,加1,那么对于 -128——-1的存储 就知道了吧
举个例子 -12 绝对值------> 12 就是 0000 1100 取反------> 1111 0011 加 1 1111 0100 (晓得不)
那么-128——127 就可以理解了
-128 是 绝对值 128 二进制--------> 1000 0000 取反 0111 1111(127) 加1 ,1000 0000 (128)
-1 的绝对值 是 1 0000 0001 取反 1111 1110 加1 1111 1111 (255)
计算机 中 -128——-1 对应存储的是 128-255
再看 2^7-1 也就是127 刚好 是0111 1111 为啥减1 因为 128 已经被占了 所以
-128——127 在数据库中真实存的是 128——255 外加 0——127 也就是 byte真正在计算机中存储范围是
0——255 只不过我们说的是它的取值范围 是 -128——127
3.byte 转 int 16进制 (int -2^31——2^31-1)
bytes[i] & 0xFF
byte和int运算,计算机会自动将 byte转化为32位,然后再运算,也就是8位转32位,那么计算机会自动将高位补1
所以-12 在计算机种就是 1111 0011--------> 1111 1111 1111 1111 1111 1111 1111 0100
然后 & 0xFF
0x 代表16进制 每一位取值范围是 0 —— 15
但是 10——15之间是两位数字了,会和10进制分部开 所以 10——15就对应了 A——F
那么0xFF 就是 0000 0000 0000 0000 0000 0000 1111 1111
&运算 得到 0000 0000 0000 0000 0000 0000 1111 0100
有没有发现什么?低八位 1111 0011 没有改变 ,那么为什么 & 0xFF而不是别的呢?
原因就是 byte 转int 前24位都被计算机强制 变成了1, 1111 1111 1111 1111 1111 1111 1111 0100 转化成int已经不是
-12在计算机中存储的值了,& 0xFF 0000 0000 0000 0000 0000 0000 1111 1111 恰好前24位都是 0,进行&运算,只会保留
低八位,也就是byte中原来在计算机中存储的值 1111 0100。