java:Long.parseLong(s,16)和Long.toHexString(l)不反转?

时间:2011-03-17 18:10:45

标签: java parsing long-integer

我得到了这个,但我没有得到它:

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数字空间。

但是为什么Long.toHexString()会生成一个无法通过Long.parseLong()解析的字符串,我该如何解决这个问题呢? (我需要一种方法来获取十六进制字符串表示的长值,然后再返回)

3 个答案:

答案 0 :(得分:6)

Long.parseLong(String s, int radix)不理解两个补码。对于负数,它预期减号。如前所述,您应该使用Long.toString(long l, int radix)使十六进制字符串与此解析方法兼容。

答案 1 :(得分:4)

这是一个已知错误,已在1.8中修复,请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4215269

答案 2 :(得分:2)

如果Java 1.8不是一个选项,你可以使用guava的UnsignedLongs.parseUnsignedLong(String s, int radix)