我得到了这个,但我没有得到它:
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()解析的字符串,我该如何解决这个问题呢? (我需要一种方法来获取十六进制字符串表示的长值,然后再返回)
答案 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)
。