代碼中加密的時候 用到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。