Как преобразовать шестнадцатеричную строку в long в java?
Я хочу преобразовать шестнадцатеричную строку в java.
Я пробовал с общим преобразованием.
String s = "4d0d08ada45f9dde1e99cad9"; long l = Long.valueOf(s).longValue(); System.out.println(l); String ls = Long.toString(l);
Но я получаю сообщение об ошибке:
- Как лексер ANTLR однозначно устраняет свои правила (или почему мой парсер создает ошибки «несоответствия ввода»)?
- Double.TryParse или Convert.ToDouble - что быстрее и безопаснее?
- Как читать значения из чисел, написанных как слова?
- Параметр DateTime с часовым поясом формы PST / CEST / UTC / etc.
- Две точки с запятой внутри круглых скобок
java.lang.NumberFormatException: For input string: "4d0d08ada45f9dde1e99cad9"
Есть ли способ конвертировать String в java? Или я пытаюсь, что на самом деле невозможно!
Благодаря!
Long.decode(str)
принимает различные форматы:
Принимает десятичные, шестнадцатеричные и восьмеричные числа, заданные следующей грамматикой:
DecodableString:
- Значок opt DecimalNumeral
- Sign opt 0x HexDigits
- Знак opt 0X HexDigits
- Sign opt # HexDigits
- Sign opt 0 OctalDigits
Знак:
- –
Но в вашем случае это не поможет, ваша строка не входит в frameworks того, что может длиться долго. Вам нужен BigInteger
:
String s = "4d0d08ada45f9dde1e99cad9"; BigInteger bi = new BigInteger(s, 16); System.out.println(bi);
Вывод:
+23846102773961507302322850521
Для сравнения здесь Long.MAX_VALUE
:
9223372036854775807
Использовать parseLong:
Long.parseLong(s, 16)
new BigInteger(string, 16).longValue()
Для любого значения someLong:
new BigInteger(Long.toHexString(someLong), 16).longValue() == someLong
Другими словами, это вернет long
вы отправили в Long.toHexString()
для любого long
значения, включая отрицательные числа. Он также будет принимать строки, которые больше, чем long
и молча возвращают нижние 64 бита строки как long
. Вы можете просто проверить длину строки <= 16 (после прорисовки пробелов), если вам нужно убедиться, что вход подходит long
.
Long.parseLong(s, 16)
будет работать только до "7fffffffffffffff"
. Вместо этого используйте BigInteger
:
public static boolean isHex(String hex) { try { new BigInteger(hex, 16); return true; } catch (NumberFormatException e) { return false; } }