【重点】java中 转16进制字符串 hex
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
會碰到兩個問題,一個是負數(shù)。例如-1,轉換后就成ffffffff,得到是8位16進制的數(shù),即1個int。我們需要的是2個16進制的數(shù)(即1個byte),即ff。辦法就是用負數(shù)加256。-1+256=255,2進制是11111111,16進制就是ff。
另一個問題是小于16的正數(shù)只有一位,即需要補0。例如15,轉換后是f,構不成1個byte,我們需要的是0f,即1個byte,所以需要在結果前面加個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ù),還是負數(shù),先拼接上6個f。利用Integer的toHexString()轉換成16進制字符串,再substring(6)將前6個f剪掉。
方法3:
BigInteger bigInteger =new BigInteger(1,bytes);
String string = bigInteger.toString(16);//轉換成16進制數(shù)的字符串
// 或者直接寫成new BigInteger(1,bytes).toString(16);
for(int i=0;i<32-string.length();){
string ="0"+string;
}
//拼接0。通常,md5會和轉16進制一起用,md5會得到一個16個數(shù)的byte數(shù)組,1個數(shù)即1個byte,16進制下是2位。16個數(shù)就是32位。
需求中,將md5加密后的數(shù)據(jù)轉換成16進制,意思是轉成32個長度的字符串。
注意:這個for循環(huán)后面不要寫i++,因為string.length()在增加,而i也在增加,如果碰到byte數(shù)組第一個數(shù)是0的話,最后只能得到31位,而非32位。
這個for循環(huán)另一個寫法:
int length=string.length();
for(int i=0;i<32-length;i++){
string ="0"+string;
}
解讀:利用BigInteger這個類,它會將bytes數(shù)組轉換成一個大數(shù)。例如,byte數(shù)組{1},轉換后就是1,byte數(shù)組{1,1},轉換后是257,byte數(shù)組{1,2},轉換后是258,byte數(shù)組{2,1},轉換后是513。
原理:它利用了拼接的思想,把byte數(shù)組里第1個數(shù)(8位)和第2個數(shù)(8位)拼在了一起,當?shù)?個數(shù)拼在第1個數(shù)后面時,因為第2個數(shù)有8位,所以第1個數(shù)是從第9位開始。所以第1個數(shù)的1,是100000000,后面接8個0,即2的8次方,256,加上第2個數(shù)的1,等于257。
在計算機里,數(shù)字用的是移位(即第1個數(shù)往左移8位即可),字符串用的是拼接。雖然處理的方法不一樣,但思想是一樣的。
總結
以上是生活随笔為你收集整理的【重点】java中 转16进制字符串 hex的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20应用统计考研复试要点(part31)
- 下一篇: 20应用统计考研复试要点(part32)