Как разобрать отрицательный Long в шестнадцатеричном формате в Java

StackOverflow https://stackoverflow.com/questions/1410168

  •  05-07-2019
  •  | 
  •  

Вопрос

У нас есть приложение J2ME, которому необходимо считывать шестнадцатеричные числа.Приложение уже слишком большое для некоторых телефонов, поэтому мы стараемся не включать какой-либо другой кодек и не писать для этого нашу собственную функцию.

Все числа представляют собой 64-разрядные целые числа со знаком в шестнадцатеричном формате, когда мы используем Long.parseLong(hex, 16), он корректно обрабатывает положительные числа, но выдает исключение для отрицательных чисел,

    long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);

Как мы можем получить -1 из этой шестнадцатеричной строки, используя классы, предоставляемые в самой Java?

Некоторые люди могут предложить нам записать наш шестнадцатеричный код как -1, как и ожидалось от Java.К сожалению, формат зафиксирован протоколом, и мы не можем его изменить.

Это было полезно?

Решение

Ваша проблема в том, что parseLong() не обрабатывает дополнение two - он ожидает, что знак будет присутствовать в форме '-'.

Если вы разрабатываете для профиля CDC, вы можете просто использовать

long l = new BigInteger("FFFFFFFFFFFFFFFF", 16).longValue()

Но профиль CLDC не имеет этого класса.Там, вероятно, самый простой способ сделать то, что вам нужно, - это разделить long, разобрать его на две половины и рекомбинировать их.Это работает:

long msb = Long.parseLong("FFFFFFFF", 16);
long lsb = Long.parseLong("FFFFFFFF", 16);
long result = msb<<32 | lsb;

Обновить

Начиная с Java 8, вы можете использовать parseUnsignedLong():

long l = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);

Другие советы

Разобрать его по кусочкам.

    long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);

В худшем случае вы можете проверить, является ли строка 16 символами, начинающимися с 8-F, и, если это так, заменить ее на эквивалентный символ без набора старших разрядов (т. е. вычесть 8 из этого цифра), проанализируйте результат и добавьте проанализированное значение к нижней границе длинного со знаком? (По сути, просто делаю 2 дополняют себя.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top