我有一个 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 位。
添加回答
举报
0/150
提交
取消