java: долго.парселонг (s,16) и длинный.toHexString (l) не инвертирует?

Я понимаю это, но все же я не понимаю:

package com.example.bugs;

public class ParseLongTest {
    public static void main(String[] args) {
        long l = -1;
        String s = Long.toHexString(l);
        System.out.println(s);
        long l2 = Long.parseLong(s, 16);
    }   
}

это не удается со следующим:

ffffffffffffffff
Exception in thread "main" java.lang.NumberFormatException: For input string: "ffffffffffffffff"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Long.parseLong(Long.java:410)
    at java.lang.Long.parseLong(Long.java:468)
    at com.example.bugs.ParseLongTest.main(ParseLongTest.java:8)

предположительно потому, что если вы буквально интерпретировали 0xffffffffffffffffffl, он не поместится в длинное пространство чисел, которое подписано.

но почему долго.toHexString () создает строку, которая не может быть проанализирована Long.parseLong (), и как мне обойти это? (Мне нужен способ получения длинных значений в их шестнадцатеричное строковое представление и обратно опять)

3 ответов


Long.parseLong(String s, int radix) не понимает дополнения two. Для отрицательного числа он ожидает знак минус. Как уже упоминалось bestsss, вы должны использовать Long.toString(long l, int radix) сделать шестнадцатеричную строку совместим с этим методом разбора.


Это известная ошибка, она исправлена в 1.8, см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4215269


вы можете использовать гуава это UnsignedLongs.parseUnsignedLong(String s, int radix) Если Java 1.8 не является опцией.