前面提到一种十六进制转二进制的方法
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);//将二进制转为十六进制}新闻热点
疑难解答