日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

【重点】java中 转16进制字符串 hex

發(fā)布時(shí)間:2023/12/19 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 【重点】java中 转16进制字符串 hex 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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è)問(wèn)題,一個(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è)問(wèn)題是小于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的“|”或符號(hào),是拼接效果。即不管是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ù)的字符串

// 或者直接寫(xiě)成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è)長(zhǎng)度的字符串。

注意:這個(gè)for循環(huán)后面不要寫(xiě)i++,因?yàn)閟tring.length()在增加,而i也在增加,如果碰到byte數(shù)組第一個(gè)數(shù)是0的話,最后只能得到31位,而非32位。

這個(gè)for循環(huán)另一個(gè)寫(xiě)法:

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位開(kāi)始。所以第1個(gè)數(shù)的1,是100000000,后面接8個(gè)0,即2的8次方,256,加上第2個(gè)數(shù)的1,等于257。

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

總結(jié)

以上是生活随笔為你收集整理的【重点】java中 转16进制字符串 hex的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。