将一个大的二进制字符串转换为十六进制

5

我有一个二进制字符串:

1010010111100101100010101010011011010001111100000010101000000000010000000111110111100"

如何将它转换为十六进制字符串?

我尝试使用包装类LongInteger,但它对我无效,并抛出NumberFormatException异常。


计算十进制值,然后使用Integer.toHexString(value); - HectorLector
4
可能是重复的问题:将包含二进制值的字符串转换为十六进制 - 这是使用“java Convert Binary String to Hex String”进行谷歌搜索的第一个结果。 - John B
1
@JohnB 那里的答案提到了使用 int / long,然而在这种情况下它们太小了。 - Michael Berry
5个回答

11

你需要使用BigInteger - 数字太大了,无法放入原始值中。在long中可以存储的最大数字是9223372036854775807,而这个二进制字符串对应的十进制值要大得多,为25069592479040759763832764。这就是为什么你会收到NumberFormatException的原因。

因此,使用BigInteger

String s = "1010010111100101100010101010011011010001111100000010101000000000010000000111110111100";
BigInteger b = new BigInteger(s, 2);
System.out.println(b.toString(16));
...这将得到:
14bcb154da3e0540080fbc

警告 - 如果您对可能以零开头的二进制字符串使用相同的转换方法,则在转换为十六进制时可能会丢失它们。 - Dave L.

2
public static String convertBinaryToHex(String binInPut) {
    int chunkLength = binInPut.length() / 4, startIndex = 0, endIndex = 4;
    String chunkVal = null;
    for (int i = 0; i < chunkLength; i++) {
        chunkVal = binInPut.substring(startIndex, endIndex);
         System.out.println(Integer.toHexString(Integer.parseInt(chunkVal, 2)));
        startIndex = endIndex;
        endIndex = endIndex + 4;
    }

    return binInPut;

}

2

由于二进制字符串的长度可能超过整数或长整数的容量,因此最好使用BigInteger。请记住,在Java中,int始终为32位,long为64位。

String binaryString = "1010010111100101100010101010011011010001111100000010101000000000010000000111110111100";
String hexString = new BigInteger(binaryString, 2).toString(16);

1

如果您正在使用大数字:

String hexString = new BigInteger(binaryString, 2).toString(16);

BigInteger会删除前导零。如果二进制字符串以“00”开头,则可能会出现问题。 - Zartc

0

我使用这个

fun String.binToHex(): String {
    val out = StringBuilder()
    val outArray = this.deviceInParts(4)
    outArray.forEach {
        if (it == "0000") out.append('0')
        if (it == "0001") out.append('1')
        if (it == "0010") out.append('2')
        if (it == "0011") out.append('3')
        if (it == "0100") out.append('4')
        if (it == "0101") out.append('5')
        if (it == "0110") out.append('6')
        if (it == "0111") out.append('7')
        if (it == "1000") out.append('8')
        if (it == "1001") out.append('9')
        if (it == "1010") out.append('A')
        if (it == "1011") out.append('B')
        if (it == "1100") out.append('C')
        if (it == "1101") out.append('D')
        if (it == "1110") out.append('E')
        if (it == "1111") out.append('F')
    }
    return out.toString()
}

fun String.deviceInParts(parts: Int): ArrayList<String> {
    val outArray = arrayListOf<String>()
    for (i in 0 until this.length step parts) {
        outArray.add(this.subString(i, parts))
    }
    return outArray
}

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

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