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()