HexString与BinaryString间转换

HexString转为BinaryString

背景介绍

前面提到一种十六进制转二进制的方法

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

从上面表格你可以看出两个问题:

  1. 这个方法虽然输出的字符串。然而高位的0被剔除掉了。
  2. 当输入的十六进制是大于7位时,该方法就无法使用了。

第2点的原因是int虽然占4个byte,也就是32个bit,但是最高位是符号位。
也就是说int的取值范围是[ -2^31 , 2^31-1 ],这是装不下4个byte的。
因此该方法最大传值是”F FF FF FF”

思路

基于上面的原因,当你的需求是将十六进制字符串 转为 二进制字符串 时,就要自己想办法了。

  1. 我们肯定还是要用到toBinaryString这个方法的。
  2. 既然HexString不能超过7位,那我们就截断,分部分转换。
  3. 但toBinaryString会把高位的0舍弃,因此我们还需要补零。

代码

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将十六进制转为二进制
        String binary = Integer.toBinaryString(Integer.parseInt(hex, 16));
        //因为高位0会被舍弃,先补上4个0
        String tmp = "0000" + binary;
        //取最后4位,将多补的0去掉
        binaryString += tmp.substring(tmp.length() - 4);
    }
    return binaryString;
}

上面这段代码比较巧妙的就是补齐被舍去的高位的0的这两步。
我们还通过表格演示:

HexString toBinaryString 补零 取后4位
F 1111 00001111 1111
1 1 00001 0001

BinaryString转为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();
}

思路

  1. 我们肯定还是要用到toHexString这个方法的。
  2. toHexString传入的是int,同样,位数是受限制的,因此需要拆分转换。
  3. 因为0xF = 1111,因此这边准备每4bit做一次转换。

我这里把外层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);//将二进制转为十六进制
}

你可能感兴趣的:(Java)