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

1

解析している数値が大きすぎて Java Long に収まりません。を追加してもL役に立ちません。Long が符号なしのデータ型であった場合は、適合します。

対処する 1 つの方法は、文字列を 2 つの部分に分割し、それらを加算するときにビット シフトを使用することです。

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,808変数は、 からまで の範囲の値を保持できます9,223,372,036,854,775,807

計算は、16 進数が 10 進数であることを示しておりfffff8000261e00018,446,735,277,656,498,176これは明らかに範囲外です。代わりに、 16 進数fffff8000261e0001,152,912,708,553,793,53610 進数であり、明らかに範囲内です。

ここで誰もが提案しBigIntegerたように、そのような場合を説明するために使用します。たとえば、BigInteger bi = new BigInteger("fffff8000261e000", 16);あなたの問題を解決します。また、正確new java.math.BigInteger("fffff8000261e000", 16).toString()に降伏18446735277656498176します。

于 2013-04-25T14:13:56.557 に答える