【重點】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

會碰到兩個問題,一個是負數。例如-1,轉換后就成ffffffff,得到是8位16進制的數,即1個int。我們需要的是2個16進制的數(即1個byte),即ff。辦法就是用負數加256。-1+256=255,2進制是11111111,16進制就是ff。
另一個問題是小於16的正數只有一位,即需要補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位數,還是負數,先拼接上6個f。利用Integer的toHexString()轉換成16進制字符串,再substring(6)將前6個f剪掉。

方法3:

BigInteger bigInteger = new BigInteger(1,bytes);

String string = bigInteger.toString(16);//轉換成16進制數的字符串

// 或者直接寫成 new BigInteger(1,bytes).toString(16);

for(int i=0;i<32-string.length();){

string ="0"+string;

}

//拼接0。通常,md5會和轉16進制一起用,md5會得到一個16個數的byte數組,1個數即1個byte,16進制下是2位。16個數就是32位。

需求中,將md5加密后的數據轉換成16進制,意思是轉成32個長度的字符串。

注意:這個for循環后面不要寫i++,因為string.length()在增加,而i也在增加,如果碰到byte數組第一個數是0的話,最后只能得到31位,而非32位。

這個for循環另一個寫法:

int length=string.length();

for(int i=0;i<32-length;i++){

string ="0"+string;

}

解讀:利用BigInteger這個類,它會將bytes數組轉換成一個大數。例如,byte數組{1},轉換后就是1,byte數組{1,1},轉換后是257,byte數組{1,2},轉換后是258,byte數組{2,1},轉換后是513。

原理:它利用了拼接的思想,把byte數組里第1個數(8位)和第2個數(8位)拼在了一起,當第2個數拼在第1個數后面時,因為第2個數有8位,所以第1個數是從第9位開始。所以第1個數的1,是100000000,后面接8個0,即2的8次方,256,加上第2個數的1,等於257。

在計算機里,數字用的是移位(即第1個數往左移8位即可),字符串用的是拼接。雖然處理的方法不一樣,但思想是一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM