Kotlin NumberFormatException
为什么"b23c77126dd924bf".toLong(16)
产生java.lang.NumberFormatException
?
截至官方文档 ,Long表示一个64位有符号整数
而0xb23c77126dd924bf
适合64位,十进制-5603472915319675713
这里的问题是,如果你没有在Kotlin文字之前明确地加上-
符号,那么总是假设文字代表一个正数。 所以这里0xB23C77126DD924BF不是根据它的二进制补码表示来解释的,如果你认为它是一个64有符号的整数,会给你-5603472915319675713。 它被解释为12843271158389875903,这是长支持范围之外。
这是与Java Integer.MAX_VALUE vs Kotlin Int.MAX_VALUE相同的问题,但这里与Long相关,而不是Int。
它的工作。使用BigInteger
val numb = "b23c77126dd924bf" val res = BigInteger(numb, 16) println(res) //12843271158389875903 println(res.toLong()) //-5603472915319675713
val l: Long = 0xB23C77126DD924BF
不能编译,而val l = -5603472915319675713
。 ( 0x
是一个整数文字!)
在这里阅读有关: 如何在java中将hex字符串转换为long?
使用BigInteger
作为桥梁: BigInteger(hexString, 16).toLong()