Kotlin NumberFormatException

Почему "b23c77126dd924bf".toLong(16) производит java.lang.NumberFormatException ??

Начиная с официальных документов , Long «Представляет собой 64-разрядное целое число со знаком»,

И 0xb23c77126dd924bf подходит для 64 бит, он десятичный -5603472915319675713

Проблема здесь в том, что если вы явно не добавляете знак перед литералом Котлина, тогда литерал всегда считается положительным числом. Итак, здесь 0xB23C77126DD924BF не интерпретируется в соответствии с его представлением с двумя дополнениями, которое даст вам -5603472915319675713, если вы предположите, что это 64-значное целое число. Он интерпретируется как 12843271158389875903, который находится за пределами поддерживаемого диапазона Long.

Это тот же вопрос, что и 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целочисленный литерал!)

Читайте об этом здесь: Как преобразовать шестнадцатеричную строку в long в java?

Используйте BigInteger в качестве моста: BigInteger(hexString, 16).toLong()