我目前正在尝试解析一些在 java 中存储为字符串的长值,我遇到的问题是:
String test = "fffff8000261e000"
long number = Long.parseLong(test, 16);
这会抛出一个 NumberFormatException:
java.lang.NumberFormatException: For input string: "fffff8000261e000"
但是,如果我敲掉字符串中的第一个“f”,它会很好地解析它。
我猜这是因为数字很大,我通常会做的是在 long 的末尾加上一个“L”来解决这个问题。但是,在从字符串解析 long 时,我无法找出最佳方法。
有人可以提供任何建议吗?
谢谢
最佳答案
有两种不同的方式来回答您的问题,具体取决于您真正寻找的行为类型。
答案 #1:正如其他人所指出的,您的字符串(解释为 正数 十六进制整数)对于 Java long
来说太大了。类型。所以如果你真的需要那么大的(正)整数,那么你需要使用不同的类型,也许是 java.math.BigInteger
,它还有一个构造函数采用 String
和基数。
答案 #2:不过,我想知道您的字符串是否表示 long
的“原始”字节.在您的示例中,它将代表一个负数。如果是这样,那么 Java 的内置 long
解析器不处理设置高位的值(即 16 位字符串的第一个数字大于 7)。
如果您遇到的是第 2 种情况,那么这里有一种(相当低效的)处理方式:
String test = "fffff8000261e000";
long number = new java.math.BigInteger(test, 16).longValue();
产生值 -8796053053440
. (如果您的字符串长度超过 16 位十六进制数字,它会默默地丢弃任何更高的位。)
如果效率是一个问题,您可以编写自己的位旋转例程,一次从字符串末尾取出两个十六进制数字,也许构建一个字节数组,然后转换为 long。一些类似的代码在这里:
关于Java从字符串中解析长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216824/