如下是MD5加密算法示例,其中使用了 OxFF的與運算:
@Test
public void md5() throws Exception{
String pwd = "1234";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bts = md.digest(pwd.getBytes());//16位
pwd = "";
for(byte bt : bts){
System.err.println("src: "+bt);
String str = Integer.toHexString(bt);
System.err.println("src:-----"+str);
str = Integer.toHexString(bt & 0xFF);//爲兒在算MD5時爲何與要0xff進行與運算呢
System.err.println("dest:"+str);
if(str.length()<=1){
str+="f";
}
pwd+=str;
System.err.println("---------------------------------");
}
System.err.println("最後的密碼是:"+pwd);
}
咱們要討論的主要問題是,爲何上面註解處要與OxFF進行與運算而不是其餘值呢?
由於OxFF的16進制數爲ffffffff (即8個f)。按與運算的法則, 算法
先來看二進制的與運算,如:-1 & 1 = 1
-1(負1)的二進制編碼爲: 11111111 11111111 11111111 11111111
即一個32位的字符串,前面一位是1表示負數
1(正1) 的二進制編碼爲: 00000000 00000000 00000000 00000001
即,只有最後一位是1,其餘部分所有爲0
按&(與運算)的法則結果: 00000000 00000000 00000000 00000001
即,只有當兩個都爲1時才爲1,因此最後的結果爲:1(正1) 編碼
則能夠知道爲何要與0xFF進行與運算,由於OxFF的16進行爲 :000000FF。
任意數與OxFF進行與運算都是取16進制的後兩位 加密
運算示例以下:
-127(負數127)的16進製爲: FFFFFF81
0xFF的16進製爲: 000000FF
則&(與)運算是結果爲: 00000081
因此:Integer.toHexStriing(-127 & 0xFF) 的結果爲:81。 md5
另外,其中不少計算,都使用0x這樣的16進制進行運行:
如 0xF的二進制爲 1111 ,即四個1。
0xFF的二進制爲 1111 1111 ,即8個1的二進制形式
每多一個F就是多一個4位的1111。
最多8個F。 字符串