二进制转十六进制遇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
相关产品推荐
相关产品推荐

