将十六进制字符串(hex)转换为二进制字符串

33
我发现以下方法用于十六进制到二进制的转换:
String binAddr = Integer.toBinaryString(Integer.parseInt(hexAddr, 16)); 

虽然这种方法适用于小的十六进制数,但对于如下的较大的十六进制数:

A14AA1DBDB818F9759

抛出一个NumberFormatException异常。

因此,我编写了以下方法,似乎可以起作用:

private String hexToBin(String hex){
    String bin = "";
    String binFragment = "";
    int iHex;
    hex = hex.trim();
    hex = hex.replaceFirst("0x", "");

    for(int i = 0; i < hex.length(); i++){
        iHex = Integer.parseInt(""+hex.charAt(i),16);
        binFragment = Integer.toBinaryString(iHex);

        while(binFragment.length() < 4){
            binFragment = "0" + binFragment;
        }
        bin += binFragment;
    }
    return bin;
}
以上方法基本上是将十六进制字符串中的每个字符转换为其二进制等效项,必要时用零填充,然后将其连接到返回值中。 这是执行转换的合适方式吗?或者我是否忽略了可能导致我的方法失败的某些因素? 提前感谢您提供的任何帮助。

长整型是否适合您的需求?它还具有ToBinaryString()函数。该类型的范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。 - Jared
如果这正是您想要的,请让我知道,这样我就可以将其发布为答案。 - Jared
你的代码看起来很不错。你也可以看一下以下链接:http://java2everyone.blogspot.in/2009/04/java-hexadecimal-to-binary.html?m=1 - Kuldeep Jain
7个回答

47

BigInteger.toString(radix)方法可以实现您想要的功能,只需将基数设置为2即可。

static String hexToBin(String s) {
  return new BigInteger(s, 16).toString(2);
}

确实。唯一的问题在于数字变得太大,无法适应 int - Louis Wasserman
这就是关键点,抱歉。溢出是OP代码的问题,而这个解决方案可以解决它。 - Louis Wasserman
谢谢,这正是我所需的。 - Mark
8
抱歉,toString(2) 不会补零。 - Andrei Botalov
1
对于8位宽度:String.format("%8s", Integer.toBinaryString(s)).replace(' ', '0'); - wmassingham
显示剩余3条评论

13

快速且适用于大型字符串:

    private String hexToBin(String hex){
        hex = hex.replaceAll("0", "0000");
        hex = hex.replaceAll("1", "0001");
        hex = hex.replaceAll("2", "0010");
        hex = hex.replaceAll("3", "0011");
        hex = hex.replaceAll("4", "0100");
        hex = hex.replaceAll("5", "0101");
        hex = hex.replaceAll("6", "0110");
        hex = hex.replaceAll("7", "0111");
        hex = hex.replaceAll("8", "1000");
        hex = hex.replaceAll("9", "1001");
        hex = hex.replaceAll("A", "1010");
        hex = hex.replaceAll("B", "1011");
        hex = hex.replaceAll("C", "1100");
        hex = hex.replaceAll("D", "1101");
        hex = hex.replaceAll("E", "1110");
        hex = hex.replaceAll("F", "1111");
        return hex;
    }

2
工作正常,同样保留前导0。 - Adam
这是唯一一个保留所有前导和尾随零的解决方案,其他的都不行。 - NLxDoDge
非常感谢。只有一个解决方案完美地工作。 - tej shah

6
Integer.parseInt(hex,16);    
System.out.print(Integer.toBinaryString(hex));

将十六进制字符串解析为16进制整数,然后使用toBinaryString(int)方法将其转换为二进制字符串。

示例:

int num = (Integer.parseInt("A2B", 16));
System.out.print(Integer.toBinaryString(num));

将会打印

101000101011

int类型可以处理的最大十六进制值为FFFFFFF。

也就是说,如果传入的值为FFFFFFF0,则会出现错误。


2
public static byte[] hexToBin(String str)
    {
        int len = str.length();
        byte[] out = new byte[len / 2];
        int endIndx;

        for (int i = 0; i < len; i = i + 2)
        {
            endIndx = i + 2;
            if (endIndx > len)
                endIndx = len - 1;
            out[i / 2] = (byte) Integer.parseInt(str.substring(i, endIndx), 16);
        }
        return out;
    }

2

全零状态:

static String hexToBin(String s) {
    String preBin = new BigInteger(s, 16).toString(2);
    Integer length = preBin.length();
    if (length < 8) {
        for (int i = 0; i < 8 - length; i++) {
            preBin = "0" + preBin;
        }
    }
    return preBin;
}

0
import java.util.*;
public class HexadeciamlToBinary
{
   public static void main()
   {
       Scanner sc=new Scanner(System.in);
       System.out.println("enter the hexadecimal number");
       String s=sc.nextLine();
       String p="";
       long n=0;
       int c=0;
       for(int i=s.length()-1;i>=0;i--)
       {
          if(s.charAt(i)=='A')
          {
             n=n+(long)(Math.pow(16,c)*10);
             c++;
          }
         else if(s.charAt(i)=='B')
         {
            n=n+(long)(Math.pow(16,c)*11);
            c++;
         }
        else if(s.charAt(i)=='C')
        {
            n=n+(long)(Math.pow(16,c)*12);
            c++;
        }
        else if(s.charAt(i)=='D')
        {
           n=n+(long)(Math.pow(16,c)*13);
           c++;
        }
        else if(s.charAt(i)=='E')
        {
            n=n+(long)(Math.pow(16,c)*14);
            c++;
        }
        else if(s.charAt(i)=='F')
        {
            n=n+(long)(Math.pow(16,c)*15);
            c++;
        }
        else
        {
            n=n+(long)Math.pow(16,c)*(long)s.charAt(i);
            c++;
        }
    }
    String s1="",k="";
    if(n>1)
    {
    while(n>0)
    {
        if(n%2==0)
        {
            k=k+"0";
            n=n/2;
        }
        else
        {
            k=k+"1";
            n=n/2;
        }
    }
    for(int i=0;i<k.length();i++)
    {
        s1=k.charAt(i)+s1;
    }
    System.out.println("The respective binary number is : "+s1);
    }
    else
    {
        System.out.println("The respective binary number is : "+n);
    }
  }
}

-1
public static byte[] hexToBytes(String string) {
 int length = string.length();
 byte[] data = new byte[length / 2];
 for (int i = 0; i < length; i += 2) {
  data[i / 2] = (byte)((Character.digit(string.charAt(i), 16) << 4) + Character.digit(string.charAt(i + 1), 16));
 }
 return data;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接