Java: Long.parseLong (s, 16) и Long.toHexString (l) не инвертирует? - PullRequest
7 голосов
/ 17 марта 2011

Я понимаю, но пока не понимаю:

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)

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

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

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

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

4 голосов
/ 02 декабря 2012

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

2 голосов
/ 06 января 2014

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

...