欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二进制十六进制相互转换

程序员文章站 2024-03-16 22:52:16
...

使用Java自带的转换方法也可以但是会有如下情况发生:

Integer.toBinaryString(Integer.valueOf("0020",16))。---java自封装的方法

  1. 如果十六进制为“0020”类似这种的情况就会转换为100000,有0的则不会转换。
  2. 十六进制很长的时候就会出错,因为通过这样的转换,在把字符串转成整形的时候,长度太长了,超过的整形的最大值,。

于是便有了如下代码

public class BinaryConversion {
    private static String hexStr =  "0123456789ABCDEF";
    private static String[] binaryArray =
            {"0000","0001","0010","0011",
                    "0100","0101","0110","0111",
                    "1000","1001","1010","1011",
                    "1100","1101","1110","1111"};

    /**
     *
     * @param str
     * @return 二进制数组转换为二进制字符串   2-2
     */
    public static String bytes2BinStr(byte[] bArray){

        String outStr = "";
        int pos = 0;
        for(byte b:bArray){
            //高四位
            pos = (b&0xF0)>>4;
            outStr+=binaryArray[pos];
            //低四位
            pos=b&0x0F;
            outStr+=binaryArray[pos];
        }
        return outStr;
    }

    /**
     *
     * @param bytes
     * @return 将二进制数组转换为十六进制字符串  2-16
     */
    public static String bin2HexStr(byte[] bytes){

        String result = "";
        String hex = "";
        for(int i=0;i<bytes.length;i++){
            //字节高4位
            hex = String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4));
            //字节低4位
            hex += String.valueOf(hexStr.charAt(bytes[i]&0x0F));
            result +=hex;  //+" "
        }
        return result;
    }

    /**
     *
     * @param hexString
     * @return 将十六进制转换为二进制字节数组   16-2
     */
    public static byte[] hexStr2BinArr(String hexString){
        //hexString的长度对2取整,作为bytes的长度
        int len = hexString.length()/2;
        byte[] bytes = new byte[len];
        byte high = 0;//字节高四位
        byte low = 0;//字节低四位
        for(int i=0;i<len;i++){
            //右移四位得到高位
            high = (byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4);
            low = (byte)hexStr.indexOf(hexString.charAt(2*i+1));
            bytes[i] = (byte) (high|low);//高地位做或运算
        }
        return bytes;
    }

    /**
     *
     * @param hexString
     * @return 将十六进制转换为二进制字符串   16-2
     */
    public static String hexStr2BinStr(String hexString){
        return bytes2BinStr(hexStr2BinArr(hexString));
    }
}

思路:

1、二进制字节转十六进制时,将字节高位与0xF0做"&"操作,然后再左移4位,得到字节高位的十六进制A;将字节低位与0x0F做"&"操作,得到低位的十六进制B,将两个十六进制数拼装到一块AB就是该字节的十六进制表示。
2、十六进制转二进制字节时,将十六进制字符对应的十进制数字右移动4为,得到字节高位A;将字节低位的十六进制字符对应的十进制数字B与A做"|"运算,即可得到十六进制的二进制字节表示

参考:

      https://blog.csdn.net/y353027520dx/article/details/51483558

      https://www.cnblogs.com/Free-Thinker/p/6808510.html