欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

二进制和十六进制转换

最编程 2024-05-22 17:54:18
...

二进制转十六进制
第一种方法是先把二进制转换为十进制,然后十进制再转换为十六进制。十进制转换为二进制或十六进制的方法差不多,给定十进制数m=Hn * 16^n+Hn-1 * 16^(n-1) +……+H1 * 16^1+H0 * 16^0.那么H0=m%16;
m/16 = Hn * 16^(n-1)+Hn-1 * 16^(n-2) +……+H1,H1=m/16%16;
m/(16^k)= Hn * 16^(n-k)+Hn-1-k * 16^(n-2-k) +……+Hk,Hk=m/(16^k)%16;代码实现

public static String binaryToHex(String binaryString)
{
    StringBuilder re = new StringBuilder();
    //先转十进制
    int num  = Integer.parseInt(binaryString);
    do 
    {
        int t = num%16;
        num/=16;
        if(t<10)
            re.insert(0,(char)(t+'0'));//0-9,(char)(1+'0')='1'
        else
            re.insert(0,(char)(t-10 +'A'));//A->10,B->11,C->12,D->13,E->14,F->15
    }while(num!=0);
    return re.toString();
    
}

还有一种方法,二进制每四位对应一个十六进制位的数,如0001对应1,1010对应A,可以每次提取四位,然后转换,如果给定的二进制字符串不是4的倍数,可以在字符串前补足0,达到位数是4的倍数。代码如下:

public static String binaryToHex(String binaryString)
{
    String result= "";
    String temp = "";
    int length = binaryString.length();
    int i = length%4;
        //补足0,达到位数是4的倍数
    if(i>0)
    {
        for(int j=0;j<4-i;j++)
            binaryString = "0"+binaryString;
    }
    
    for(int index=0;index<=binaryString.length()-4;index+=4)
    {
        temp = binaryString.substring(index, index+4);//每次取出一个字符串,个数为4,
        result+=binaryToHexChar(temp);
    }
    return result;
}

四个二进制位数转化为十进制位(一位),代码如下:

public static char binaryToHexChar(String temp)
{
    char c=' ';
    String[] binary= {
            "0000","0001","0010","0011",
            "0100","0101","0110","0111",
            "1000","1001","1010","1011",
            "1100","1101","1110","1111"
    };
    char[] chs = {
            '0','1','2','3',
            '4','5','6','7',
            '8','9','A','B',
            'C','D','E','F'};
    for(int i=0;i<binary.length;i++)
    {
        if(temp.equalsIgnoreCase(binary[i]))
        {
            c = chs[i];
            break;
        }
    }
    return c;
}

测试代码:

public static void main(String[] args) 
{
    Random ran  = new Random();
    String[] str = new String[5];
    for(int i=0;i<str.length;i++)
    {
        str[i] = Integer.toBinaryString(ran.nextInt(Integer.MAX_VALUE));
    }
    for(int i=0;i<str.length;i++)
    {
    System.out.println("-----------------");
    System.out.println(Integer.toHexString(Integer.parseInt(str[i],2)));
;
    System.out.println(binaryToHex(str[i]));
    System.out.println(binaryToHex1(str[i]));
    System.out.println("-----------------");
        }
    }
测试结果:
-----------------
26ccc4ca
26CCC4CA
26CCC4CA
-----------------
-----------------
4ba2113c
4BA2113C
4BA2113C
-----------------
-----------------
29b9434a
29B9434A
29B9434A
-----------------
-----------------
43a7d9e2
43A7D9E2
43A7D9E2
-----------------
-----------------
276ada8f
276ADA8F
276ADA8F

十六进制转二进制(十六进制和二进制都是字符串表示)
对每一个十六进制位数转化为一个四位的二进制字符串
代码如下:

public static String HexToBinary(String str)
{
    StringBuilder str1 = new StringBuilder();
    
    for(int i=0;i<str.length();i++)
        str1.append(hexCharToBinary(str.charAt(i)));
    int i=0;
   //把开始的0去掉,如果都是0,只返回“0”
    while(i<str1.length())
    {
        if(str1.charAt(i)!='0')
            break;
        i++;
    }
    if(i==str1.length())
        return "0";
    return str1.substring(i);
        
}

每一位的转换代码:

public static String hexCharToBinary(char ch)
{
    String str = "";
    switch(ch)
    {
        case '0':
            str = "0000";
            break;
        case '1':
            str = "0001";
            break;
        case '2':
            str = "0010";
            break;
        case '3':
            str = "0011";
            break;
        case '4':
            str = "0100";
            break;
        case '5':
            str = "0101";
            break;
        case '6':
            str = "0110";
            break;
        case '7':
            str = "0111";
            break;
        case '8':
            str = "1000";
            break;
        case '9':
            str = "1001";
            break;
        case 'a':
            str = "1010";
            break;
        case 'b':
            str = "1011";
            break;
        case 'c':
            str = "1100";
            break;
        case 'd':
            str = "1101";
            break;
        case 'e':
            str = "1110";
            break;
        case 'f':
            str = "1111";
            break;
    }
    
    return str;
        
}

测试代码:

public static void main(String[] args) 
{
    Random ran  = new Random();
    String[] str = new String[5];
    for(int i=0;i<str.length;i++)
    {
        str[i] = Integer.toHexString(ran.nextInt(Integer.MAX_VALUE));
    }
        
    for(int i=0;i<str.length;i++)
    {
        System.out.println("-----------------");
        System.out.println(str[i]);
        System.out.println(Integer.toBinaryString(Integer.parseInt(str[i],16)));
;       System.out.println(HexToBinary(str[i]));
        System.out.println("-----------------");
    }
}
结果如下:
-----------------
56b0e081
1010110101100001110000010000001
1010110101100001110000010000001
-----------------
-----------------
3a58b0a4
111010010110001011000010100100
111010010110001011000010100100
-----------------
-----------------
65593dcb
1100101010110010011110111001011
1100101010110010011110111001011
-----------------
-----------------
4a7356a8
1001010011100110101011010101000
1001010011100110101011010101000
-----------------
-----------------
788f0ee1
1111000100011110000111011100001
1111000100011110000111011100001
-----------------

这里只是完成的主要代码,主要是思路,还有参数的合法性没有检测,还有一些特殊情况没有处理,主要是解决问题的思路,供大家参考。
由于水平有限,如果有错误,请大家多多批评指导,提高水平,共同学习。