You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二进制转十六进制遇NumberFormatException:bin1转换失败bin2正常

问题分析与解决方案

这个问题我之前也碰到过,原因其实和Java整数类型的范围以及二进制字符串的解析规则有关,咱们一步步拆解:

为什么bin1会抛出NumberFormatException?

Java的int是32位有符号整数,范围是 -2^31 到 2^31-1(也就是 -2147483648 到 2147483647)。但这里的关键是:Integer.parseInt(String s, int radix) 解析二进制字符串时,不会把最高位当成符号位,而是把整个字符串当作无符号数值来处理。

你的bin1是32位二进制字符串,第一位是1,对应的无符号数值是 3735928576,这个值已经超过了int的最大值2147483647,所以会直接抛出NumberFormatException。而bin2第一位是0,对应的无符号数值是1684300800,在int的范围内,所以能正常解析。

至于你改成long类型问题依旧,大概率是只修改了变量类型,却还是用Integer.parseInt来解析——这个方法本身只能处理int范围内的数值,和你接收结果的变量类型无关,自然还是会报错。

两种可行的解决方案

方案1:用Long.parseLong解析(兼容所有Java版本)

long是64位整数,可以轻松容纳32位无符号二进制的数值,只需要把解析和转换的方法换成long对应的版本即可:

public class Test{ 
    public static void main(String[] args) { 
        String bin1 = "11011100000000010001000000000000"; 
        String bin2 = "01100100001000010001000000000000"; 
        long dec = Long.parseLong(bin1, 2); 
        String hex = Long.toString(dec, 16); 
        System.out.println(hex); // 输出 dc011000
    } 
}

方案2:用Integer.parseUnsignedInt(Java 8及以上)

如果你只需要处理32位无符号二进制,Java 8及以上提供了专门的无符号整数解析方法,不需要切换到long:

public class Test{ 
    public static void main(String[] args) { 
        String bin1 = "11011100000000010001000000000000"; 
        String bin2 = "01100100001000010001000000000000"; 
        int dec = Integer.parseUnsignedInt(bin1, 2); 
        String hex = Integer.toHexString(dec); 
        System.out.println(hex); // 同样输出 dc011000
    } 
}

内容的提问来源于stack exchange,提问作者BWB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:13:30