| private static String byte2hex(byte[] b) { StringBuffer buf = new StringBuffer(); int i; for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) { i += 256; } if (i < 16) { buf.append("0"); } buf.append(Integer.toHexString(i)); } return buf.toString(); }
 String s = Integer.toHexString(int)  //1-->1,15-->f,16-->10,-1-->ffffffff
 會(huì)碰到兩個(gè)問題,一個(gè)是負(fù)數(shù)。例如-1,轉(zhuǎn)換后就成ffffffff,得到是8位16進(jìn)制的數(shù),即1個(gè)int。我們需要的是2個(gè)16進(jìn)制的數(shù)(即1個(gè)byte),即ff。辦法就是用負(fù)數(shù)加256。-1+256=255,2進(jìn)制是11111111,16進(jìn)制就是ff。 另一個(gè)問題是小于16的正數(shù)只有一位,即需要補(bǔ)0。例如15,轉(zhuǎn)換后是f,構(gòu)不成1個(gè)byte,我們需要的是0f,即1個(gè)byte,所以需要在結(jié)果前面加個(gè)0。 方法2: StringBuffer buf = new StringBuffer(); for(int offset=0;offset<bytes.length;offset++){ buf.append(Integer.toHexString(bytes[offset] | 0xffffff00).substring(6)); } 解讀:bytes[offset] | 0xffffff00的“|”或符號,是拼接效果。即不管是1位數(shù),還是負(fù)數(shù),先拼接上6個(gè)f。利用Integer的toHexString()轉(zhuǎn)換成16進(jìn)制字符串,再substring(6)將前6個(gè)f剪掉。
 方法3: 		BigInteger bigInteger = new BigInteger(1,bytes); 		String string = bigInteger.toString(16);//轉(zhuǎn)換成16進(jìn)制數(shù)的字符串 // 或者直接寫成 new BigInteger(1,bytes).toString(16); for(int i=0;i<32-string.length();){ string ="0"+string; } //拼接0。通常,md5會(huì)和轉(zhuǎn)16進(jìn)制一起用,md5會(huì)得到一個(gè)16個(gè)數(shù)的byte數(shù)組,1個(gè)數(shù)即1個(gè)byte,16進(jìn)制下是2位。16個(gè)數(shù)就是32位。 需求中,將md5加密后的數(shù)據(jù)轉(zhuǎn)換成16進(jìn)制,意思是轉(zhuǎn)成32個(gè)長度的字符串。 注意:這個(gè)for循環(huán)后面不要寫i++,因?yàn)閟tring.length()在增加,而i也在增加,如果碰到byte數(shù)組第一個(gè)數(shù)是0的話,最后只能得到31位,而非32位。 這個(gè)for循環(huán)另一個(gè)寫法: int length=string.length(); for(int i=0;i<32-length;i++){ string ="0"+string; } 解讀:利用BigInteger這個(gè)類,它會(huì)將bytes數(shù)組轉(zhuǎn)換成一個(gè)大數(shù)。例如,byte數(shù)組{1},轉(zhuǎn)換后就是1,byte數(shù)組{1,1},轉(zhuǎn)換后是257,byte數(shù)組{1,2},轉(zhuǎn)換后是258,byte數(shù)組{2,1},轉(zhuǎn)換后是513。 原理:它利用了拼接的思想,把byte數(shù)組里第1個(gè)數(shù)(8位)和第2個(gè)數(shù)(8位)拼在了一起,當(dāng)?shù)?個(gè)數(shù)拼在第1個(gè)數(shù)后面時(shí),因?yàn)榈?個(gè)數(shù)有8位,所以第1個(gè)數(shù)是從第9位開始。所以第1個(gè)數(shù)的1,是100000000,后面接8個(gè)0,即2的8次方,256,加上第2個(gè)數(shù)的1,等于257。 在計(jì)算機(jī)里,數(shù)字用的是移位(即第1個(gè)數(shù)往左移8位即可),字符串用的是拼接。雖然處理的方法不一樣,但思想是一樣的。
 |