hexString.toInt(32)NumberFormatException

时间:2018-10-03 15:22:16

标签: android kotlin

我有一个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,所以请原谅我的无知。

1 个答案:

答案 0 :(得分:3)

首先,您似乎误解了基数,它是valueOfparseInt中的第二个参数,并且是扩展功能为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。