2013-04-20 171 views
2

我已经看了很多帖子在这里关于这个问题的stackoverflow,我已经找到了部分解决方案,但到目前为止我还没有找到一个适合我的解决方案。 new BigDecimal("3324679375210329505").toString(2); 似乎最适合我(从:Convert a large 2^63 decimal to binary),但我确实需要前导和尾随零。无论如何,我可以将一个大(大于一个长)十六进制转换为二进制(字符串)表示?大十六进制到二进制

在此先感谢。

回答

3

BigInteger类处理任意大的数字。

已经处理了尾随零。为了处理前导零,只需要添加一个“1”在前面,确保了领先的“1”位,然后再次关闭剥离回:

String bits = new BigInteger("1" + hex, 16).toStting(2).substring(1); 
+0

@jlordo它做:'BigInteger的(字符串str,诠释基数)' – 2013-04-20 20:52:55

+0

@ValeriAtamaniouk:是的,你是对的,我在看BgDecimal。我的错。 – jlordo 2013-04-20 20:59:58

+0

但我相信这个解决方案摆脱了前导零,为了正确转换到base64(我的最终目标),我需要前导零和尾随零。 – 2013-04-20 21:02:40

2

您需要前导零?我不知道一个内置的功能,但你可以很容易地实现它自己:

public static String hex2binary(String hex) { 
    StringBuilder result = new StringBuilder(hex.length() * 4); 
    for (char c : hex.toUpperCase().toCharArray()) { 
     switch (c) { 
     case '0': result.append("0000"); break; 
     case '1': result.append("0001"); break; 
     case '2': result.append("0010"); break; 
     case '3': result.append("0011"); break; 
     case '4': result.append("0100"); break; 
     case '5': result.append("0101"); break; 
     case '6': result.append("0110"); break; 
     case '7': result.append("0111"); break; 
     case '8': result.append("1000"); break; 
     case '9': result.append("1001"); break; 
     case 'A': result.append("1010"); break; 
     case 'B': result.append("1011"); break; 
     case 'C': result.append("1100"); break; 
     case 'D': result.append("1101"); break; 
     case 'E': result.append("1110"); break; 
     case 'F': result.append("1111"); break; 
     default: throw new IllegalArgumentException("Invalid hex: '" + hex + "'"); 
     } 
    } 
    return result.toString(); 
} 
+0

不错的一个。我怀疑在开关中处理小写字符可能会更快,然后调用'toUpperCase' ... – 2013-04-20 21:03:02

+0

@ValeriAtamaniouk:你的意思是额外的情况?我懒得打字;)无论输入多长时间,这不会是应用程序的瓶颈... – jlordo 2013-04-20 21:03:36

+0

伟大的是我正在寻找的答案,非常简单但非常有用:) – 2013-04-20 21:06:06