为了账号安全,请及时绑定邮箱和手机立即绑定

hexString.toInt(32) NumberFormatException

hexString.toInt(32) NumberFormatException

动漫人物 2021-10-27 10:37:31
我有一个 32 位十六进制值,我希望将其转换为整数。给定十六进制字符串,以下方法都提供以下错误C71C5E00:java.lang.NumberFormatException:对于输入字符串:“C71C5E00”"C71C5E00".toInt(32) Integer.valueOf("C71C5E00", 32)Kotlin文档指出 Int表示 32 位有符号整数,因此并不是说该值太大而无法装入 Int。我试过,在0x字符串之前,徒劳无功。我尝试过:java.lang.Integer.parseInt("C71C5E00", 32)不幸的是,我仍然收到同样的错误。我不经常接触 Android 或 Kotlin,所以请原谅我的无知。
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

首先,您似乎误解了基数,它是valueOfand 中的第二个parseInt参数,也是扩展函数 的唯一参数toInt。它不代表目标数字类型中的位,它告诉方法如何通过通知它正在运行的基数来转换你的字符串。请注意,还有第二个问题,我将在后面讨论。


基数是基础数字系统的基数。默认情况下,它是10(0-ARGtoInt()方法toInt()调用parseInt,就像这样:


public static int parseInt(String s) throws NumberFormatException {

    return parseInt(s,10);

}

如您所见,它使用基数 = 10。同样,数字类型的位在这里无关紧要。维基百科很好地涵盖了它,Java 或多或少遵循相同的系统。如您所见,16 对应于十六进制。所以这里使用的合适基数是 16。


然而,就像我提到的,还有第二个问题。它仍然会崩溃,因为无法解析该值。结果数字是3340525056,它大于最大 int 值,即 2147483647。


这意味着,您不能使用任何 int 方法;你需要使用它们Long。


所以,对于你的情况,这很好:


val x = "C71C5E00".toLong(16)

同样,基数是要使用的数字系统,而不是结果数字中的位数。如果是,则需要使用 64 来表示多头。


奖励:整数和长整数具有预定数量的位。通过使用toInt(),您已经隐式请求 32 位。使用 Long,您请求的是 64 位。


查看完整回答
反对 回复 2021-10-27
  • 1 回答
  • 0 关注
  • 176 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信