1

我目前正在尝试解析一些在java中存储为字符串的长值,我遇到的问题是:

String test = "fffff8000261e000"
long number = Long.parseLong(test, 16);

这会引发 NumberFormatException:

java.lang.NumberFormatException: For input string: "fffff8000261e000"

但是,如果我从字符串中敲掉第一个“f”,它就可以很好地解析它。

我猜这是因为这个数字很大,我通常会在 long 的末尾加上一个“L”来解决这个问题。但是,在从字符串中解析 long 时,我无法找到最好的方法。

任何人都可以提供任何建议吗?

谢谢

4

3 回答 3

4

有两种不同的方法可以回答您的问题,具体取决于您真正要寻找的行为类型。

答案 #1:正如其他人所指出的,您的字符串(解释为long十六进制整数)对于 Java类型来说太大了。因此,如果您真的需要那么大的(正)整数,那么您将需要使用不同的类型,也许java.math.BigInteger,它还有一个带有 aString和一个基数的构造函数。

答案 #2:不过,我想知道您的字符串是否代表long. 在您的示例中,它将代表一个负数。如果是这种情况,那么 Java 的内置long解析器不会处理设置了高位的值(即 16 位字符串的第一个数字大于 7)。

如果您是第 2 种情况,那么这是一种(非常低效)的处理方式:

String test = "fffff8000261e000";
long number = new java.math.BigInteger(test, 16).longValue();

产生价值-8796053053440。(如果您的字符串长度超过 16 个十六进制数字,它会默默地丢弃任何更高的位。)

如果效率是一个问题,您可以编写自己的位旋转例程,一次从字符串末尾取出两个十六进制数字,也许构建一个字节数组,然后转换为长整数。一些类似的代码在这里:

如何将 Java Long 转换为 Cassandra 的字节 []?

于 2013-04-25T14:28:22.943 回答
1

您正在解析的数字太大,无法放入 java Long。添加一个L不会有帮助。如果 Long 是无符号数据类型,它会适合。

一种解决方法是将字符串分成两部分,然后在将它们加在一起时使用位移:

String s= "fffff8000261e000";
long number;
long n1, n2;

if (s.length() < 16) {
    number = Long.parseLong(s, 16);
}
else {
    String s1 = s.substring(0, 1);
    String s2 = s.substring(1, s.length());

    n1=Long.parseLong(s1, 16) << (4 * s2.length());
    n2= Long.parseLong(s2, 16);

    number = (Long.parseLong(s1, 16) << (4 * s2.length())) + Long.parseLong(s2, 16);
    System.out.println( Long.toHexString(n1));
    System.out.println( Long.toHexString(n2));
    System.out.println( Long.toHexString(number));
}

笔记:

如果数字大于 Long.MAX_VALUE,则结果long将为负值,但位模式将与输入匹配。

于 2013-04-25T14:13:26.513 回答
1

原始long变量可以保存范围从-9,223,372,036,854,775,8089,223,372,036,854,775,807包括在内的值。

计算表明,fffff8000261e000hexademical 是18,446,735,277,656,498,176十进制,这显然是越界了。相反,十六进制fffff8000261e0001,152,912,708,553,793,536十进制,这显然在界限内。

正如这里的每个人都建议的那样,使用BigInteger来解释这种情况。例如,BigInteger bi = new BigInteger("fffff8000261e000", 16);将解决您的问题。此外,new java.math.BigInteger("fffff8000261e000", 16).toString()18446735277656498176准确地产生。

于 2013-04-25T14:13:56.557 回答