前面提到一種十六進制轉二進制的方法
Integer.toBinaryString(Integer.valueOf("FFFF",16));其中”FFFF”是你輸入的hexString。
結果展示:
HexString | BinaryString |
---|---|
0xFF | 1111 1111 |
0x1F | 1 1111 |
0x00 1F | 1 1111 |
0xFF FF FF FF | ERROR |
從上面表格你可以看出兩個問題:
這個方法雖然輸出的字符串。然而高位的0被剔除掉了。當輸入的十六進制是大于7位時,該方法就無法使用了。第2點的原因是int雖然占4個byte,也就是32個bit,但是最高位是符號位。 也就是說int的取值范圍是[ -2^31 , 2^31-1 ],這是裝不下4個byte的。 因此該方法最大傳值是”F FF FF FF”
基于上面的原因,當你的需求是將十六進制字符串 轉為 二進制字符串 時,就要自己想辦法了。
我們肯定還是要用到toBinaryString這個方法的。既然HexString不能超過7位,那我們就截斷,分部分轉換。但toBinaryString會把高位的0舍棄,因此我們還需要補零。上面這段代碼比較巧妙的就是補齊被舍去的高位的0的這兩步。 我們還通過表格演示:
HexString | toBinaryString | 補零 | 取后4位 |
---|---|---|---|
F | 1111 | 00001111 | 1111 |
1 | 1 | 00001 | 0001 |
我這里把外層for循環里的代碼我拆解了一下:
int bit = 0;//存放一個4位二進制數字//這個for循環i += 4,意思是每次跳過4個字符//即 每次循環處理的是4位,(1位十六進制占 4 位二進制,eg:0xF = 1111)//其實就是每次取4位,轉為十六進制的1位//因為字符串沒有高低位之分,索引轉為for (int i = 0; i < binaryString.length(); i += 4) { //假設本次循環拿到的二進制數字是:1001 //取第一個字符:"1" String str4 = binaryString.substring(i, i + 1); //將這個1轉為int得到0001,左移3位,將這個1放在最高位 :1000(1xxx) int bit4 = Integer.parseInt(str4) << 3; //取第二個字符:"0",左移2位,得到:0000(x0xx) int bit3 = Integer.parseInt(binaryString.substring(i + 1, i + 2)) << 2; //取第三個字符:"0",左移1位,得到:0000(xx0x) int bit2 = Integer.parseInt(binaryString.substring(i + 2, i + 3)) << 1; //取第三個字符:"1",不用移動,得到: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);//將二進制轉為十六進制}新聞熱點
疑難解答