Как разобрать отрицательный лонг в Hex на Java - PullRequest
11 голосов
/ 11 сентября 2009

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

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

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

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

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

Ответы [ 3 ]

21 голосов
/ 11 сентября 2009

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

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

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

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

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

UPDATE

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

long l = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);
7 голосов
/ 11 сентября 2009

Разобрать на куски.

    long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);
0 голосов
/ 11 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...