小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【重點(diǎn)】java中 轉(zhuǎn)16進(jìn)制字符串 hex

 一本正經(jīng)地胡鬧 2019-09-07

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位即可),字符串用的是拼接。雖然處理的方法不一樣,但思想是一樣的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多