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

Posted

技术标签:

【中文标题】将十六进制字符串(hex)转换为二进制字符串【英文标题】:Convert hexadecimal string (hex) to a binary string 【发布时间】:2012-03-04 00:24:30 【问题描述】:

我找到了以下十六进制到二进制转换的方式:

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。 如果您希望这样做,请告诉我,以便我发布答案。 您的代码对我来说看起来不错。您还可以查看以下链接:java2everyone.blogspot.in/2009/04/… 【参考方案1】:

BigInteger.toString(radix) 会做你想做的事。只需传入 2 的基数。

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

【讨论】:

确实如此。这里唯一的问题是数字太大而无法容纳int 这就是重点,抱歉。溢出是 OP 代码的问题,这个解决方案解决了它。 谢谢,这正是我所缺少的。 不幸的是,toString(2) 没有用零填充 8 位宽度:String.format("%8s", Integer.toBinaryString(s)).replace(' ', '0');【参考方案2】:

速度快,适用于大字符串:

    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;
    

【讨论】:

效果很好,也保持领先的 0。 这是唯一保留所有前导和尾随零的解决方案,其余的则没有。【参考方案3】:
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 处理的最大 Hex vakue 为 FFFFFFF

即如果 FFFFFFF0 被传递 ti 会报错

【讨论】:

【参考方案4】:

全为零:

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;

【讨论】:

【参考方案5】:
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;
    

【讨论】:

【参考方案6】:
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);
    
  

【讨论】:

【参考方案7】:
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;

【讨论】:

以上是关于将十六进制字符串(hex)转换为二进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

怎样在PHP中把16进制HEX数据转换为2进制数据呢?

PHP将字符串转换为十六进制和十六进制到字符串

Mysql中Hex()和Unhex()函数详解

nodejs中的十六进制到字符串和字符串到十六进制的转换

Perl - 将十六进制转换为二进制并将其用作字符串

在Postgres中将十六进制字符串转换为bigint [重复]