我有一个32位十六进制值,希望将其转换为整数。
在给定十六进制字符串C71C5E00
的情况下,以下方法都提供以下错误:
java.lang.NumberFormatException:对于输入字符串:“ C71C5E00”
"C71C5E00".toInt(32)
Integer.valueOf("C71C5E00", 32)
Kotlin docs声明Int 表示一个32位有符号整数,因此它的值不是太大而不能装入Int。我曾尝试将0x
放在字符串前面,但徒劳地尝试。
编辑:按照我尝试的this个问题:
java.lang.Integer.parseInt("C71C5E00", 32)
不幸的是,我仍然收到相同的错误。
我不经常碰Android或Kotlin,所以请原谅我的无知。
答案 0 :(得分:3)
首先,您似乎误解了基数,它是valueOf
和parseInt
中的第二个参数,并且是扩展功能为toInt
的唯一参数。它不代表目标数字类型中的位,而是告诉方法如何转换字符串。请注意,还有第二个问题,我稍后会再讲。
基数是基础数字系统的基数。默认情况下为10(0参数toInt()
方法。toInt()
调用parseInt
,如下所示:
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
如您所见,它使用radix =10。同样,数字类型的位在这里不相关。 Wikipedia涵盖得很好,Java或多或少遵循相同的系统。如您所见,16对应于十六进制。因此,此处使用的基数为16。
但是,就像我提到的那样,还有第二个问题。它仍然会崩溃,因为无法解析该值。结果数字为3340525056
,大于最大整数值2147483647。
这意味着,您不能使用任何int方法;您将需要使用Long
个。
所以,对于您的情况,这很好:
val x = "C71C5E00".toLong(16)
同样,基数是要使用的数字系统,而不是结果数字中的位数。如果是这样,则需要长时间使用64。