Подтвердить что ты не робот

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

Я хочу преобразовать шестую строку в long в java.

Я пробовал с общим преобразованием.

String s = "4d0d08ada45f9dde1e99cad9";
long l = Long.valueOf(s).longValue();
System.out.println(l);
String ls = Long.toString(l);

Но я получаю это сообщение об ошибке:

java.lang.NumberFormatException: For input string: "4d0d08ada45f9dde1e99cad9"

Есть ли способ конвертировать String в java? Или я пытаюсь, что на самом деле невозможно!

Спасибо!

4b9b3361

Ответ 1

Long.decode(str) принимает различные форматы:

Принимает десятичную, шестнадцатеричную и восьмеричную числа, заданные следующими Грамматика:
DecodableString:

  • Подписать opt DecimalNumeral
  • Знак opt 0x HexDigits
  • Знак opt 0X HexDigits
  • Знак opt # HexDigits
  • Знак opt 0 OctalDigits

Знак:

  • -

Но в вашем случае это не поможет, ваша String выходит за рамки того, что может длиться долго. Вам понадобится BigInteger:

String s = "4d0d08ada45f9dde1e99cad9";
BigInteger bi = new BigInteger(s, 16);
System.out.println(bi);

Вывод:

+23846102773961507302322850521

Для сравнения здесь Long.MAX_VALUE:

9223372036854775807

Ответ 2

Использовать parseLong:

Long.parseLong(s, 16)

Ответ 3

new BigInteger(string, 16).longValue()

Для любого значения someLong:

new BigInteger(Long.toHexString(someLong), 16).longValue() == someLong

Другими словами, это вернет long, который вы отправили в Long.toHexString() для любого значения long, включая отрицательные числа. Он также примет строки, которые больше, чем long, и тихо возвращают младшие 64 бита строки как long. Вы можете просто проверить длину строки <= 16 (после обрезания пробелов), если вам нужно убедиться, что вход соответствует значению long.

Ответ 4

Long.parseLong(s, 16) будет работать только до "7fffffffffffffff". Вместо этого используйте BigInteger:

public static boolean isHex(String hex) {
    try {
        new BigInteger(hex, 16);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}