国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

HexString與BinaryString間轉(zhuǎn)換

2019-11-06 08:04:15
字體:
供稿:網(wǎng)友

HexString轉(zhuǎn)為BinaryString

背景介紹

前面提到一種十六進(jìn)制轉(zhuǎn)二進(jìn)制的方法

Integer.toBinaryString(Integer.valueOf("FFFF",16));

其中”FFFF”是你輸入的hexString。

結(jié)果展示:

HexString BinaryString
0xFF 1111 1111
0x1F 1 1111
0x00 1F 1 1111
0xFF FF FF FF ERROR

從上面表格你可以看出兩個(gè)問題:

這個(gè)方法雖然輸出的字符串。然而高位的0被剔除掉了。當(dāng)輸入的十六進(jìn)制是大于7位時(shí),該方法就無法使用了。

第2點(diǎn)的原因是int雖然占4個(gè)byte,也就是32個(gè)bit,但是最高位是符號位。 也就是說int的取值范圍是[ -2^31 , 2^31-1 ],這是裝不下4個(gè)byte的。 因此該方法最大傳值是”F FF FF FF”

思路

基于上面的原因,當(dāng)你的需求是將十六進(jìn)制字符串 轉(zhuǎn)為 二進(jìn)制字符串 時(shí),就要自己想辦法了。

我們肯定還是要用到toBinaryString這個(gè)方法的。既然HexString不能超過7位,那我們就截?cái)啵植糠洲D(zhuǎn)換。但toBinaryString會(huì)把高位的0舍棄,因此我們還需要補(bǔ)零。

代碼

public static String hexString2binaryString(String hexString) { if (TextUtils.isEmpty(hexString)) { return null; } String binaryString = ""; for (int i = 0; i < hexString.length(); i++) { //截取hexStr的一位 String hex = hexString.substring(i, i + 1); //通過toBinaryString將十六進(jìn)制轉(zhuǎn)為二進(jìn)制 String binary = Integer.toBinaryString(Integer.parseInt(hex, 16)); //因?yàn)楦呶?會(huì)被舍棄,先補(bǔ)上4個(gè)0 String tmp = "0000" + binary; //取最后4位,將多補(bǔ)的0去掉 binaryString += tmp.substring(tmp.length() - 4); } return binaryString;}

上面這段代碼比較巧妙的就是補(bǔ)齊被舍去的高位的0的這兩步。 我們還通過表格演示:

HexString toBinaryString 補(bǔ)零 取后4位
F 1111 00001111 1111
1 1 00001 0001

BinaryString轉(zhuǎn)為HexString

代碼

public static String binaryString2hexString(String binaryString) { if (TextUtils.isEmpty(binaryString) || binaryString.length() % 4 != 0) { return null; } String hexString = ""; int bit = 0; for (int i = 0; i < binaryString.length(); i += 4) { bit = 0; for (int j = 0; j < 4; j++) { String x = binaryString.substring(i + j, i + j + 1); bit += Integer.parseInt(x) << (4 - j - 1); } hexString += Integer.toHexString(bit); } return hexString.toString();}

思路

我們肯定還是要用到toHexString這個(gè)方法的。toHexString傳入的是int,同樣,位數(shù)是受限制的,因此需要拆分轉(zhuǎn)換。因?yàn)?xF = 1111,因此這邊準(zhǔn)備每4bit做一次轉(zhuǎn)換。

我這里把外層for循環(huán)里的代碼我拆解了一下:

int bit = 0;//存放一個(gè)4位二進(jìn)制數(shù)字//這個(gè)for循環(huán)i += 4,意思是每次跳過4個(gè)字符//即 每次循環(huán)處理的是4位,(1位十六進(jìn)制占 4 位二進(jìn)制,eg:0xF = 1111)//其實(shí)就是每次取4位,轉(zhuǎn)為十六進(jìn)制的1位//因?yàn)樽址疀]有高低位之分,索引轉(zhuǎn)為for (int i = 0; i < binaryString.length(); i += 4) { //假設(shè)本次循環(huán)拿到的二進(jìn)制數(shù)字是:1001 //取第一個(gè)字符:"1" String str4 = binaryString.substring(i, i + 1); //將這個(gè)1轉(zhuǎn)為int得到0001,左移3位,將這個(gè)1放在最高位 :1000(1xxx) int bit4 = Integer.parseInt(str4) << 3; //取第二個(gè)字符:"0",左移2位,得到:0000(x0xx) int bit3 = Integer.parseInt(binaryString.substring(i + 1, i + 2)) << 2; //取第三個(gè)字符:"0",左移1位,得到:0000(xx0x) int bit2 = Integer.parseInt(binaryString.substring(i + 2, i + 3)) << 1; //取第三個(gè)字符:"1",不用移動(dòng),得到:0001(xxx1) int bit1 = Integer.parseInt(binaryString.substring(i + 3, i + 4)); //1001 = 1000 + 0000 + 0000 + 0001 bit = bit4 + bit3 + bit2 + bit1; hexString += Integer.toHexString(bit);//將二進(jìn)制轉(zhuǎn)為十六進(jìn)制}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五莲县| 张家港市| 千阳县| 陆河县| 镇赉县| 临桂县| 临泽县| 阿克| 兰坪| 确山县| 乐平市| 民丰县| 盘锦市| 贵港市| 镇坪县| 安溪县| 横峰县| 新邵县| 泾川县| 莱芜市| 霸州市| 环江| 吕梁市| 乃东县| 辰溪县| 石狮市| 洮南市| 肇东市| 福贡县| 绥芬河市| 孙吴县| 濉溪县| 莲花县| 灯塔市| 凌源市| 资兴市| 巴彦淖尔市| 抚顺市| 富锦市| 沁水县| 金溪县|