質問

16進数を読み取る必要があるJ2MEアプリケーションがあります。一部の携帯電話にはアプリケーションが既に大きすぎるため、他のコーデックを含めたり、独自の関数を記述したりしないようにしています。

すべての数値は16進数の64ビット符号付き整数です。Long.ParseLong(hex、16)を使用すると、正の数値は正しく処理されますが、負の数値では例外がスローされます

    long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);

Java自体で提供されるクラスを使用して、その16進文字列から-1を取得するにはどうすればよいですか?

一部の人々は、Javaが期待するようにhexを-1として書くことを提案するかもしれません。申し訳ありませんが、形式はプロトコルによって修正されており、変更できません。

役に立ちましたか?

解決

問題は、 parseLong() は2の補数を処理しません-'-'の形で記号が存在することを期待します。

CDCプロファイル用に開発している場合は、簡単に使用できます

long l = new BigInteger("FFFFFFFFFFFFFFFF", 16).longValue()

しかし、CLDCプロファイルにはそのクラスがありません。そこで、必要なことを行う最も簡単な方法は、おそらく長いものを分割し、それを2つの半分に解析し、それらを再結合することです。これは動作します:

long msb = Long.parseLong("FFFFFFFF", 16);
long lsb = Long.parseLong("FFFFFFFF", 16);
long result = msb<<32 | lsb;

更新

Java 8以降では、 parseUnsignedLong()

long l = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);

他のヒント

チャンクで解析します。

    long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);

最悪のシナリオでは、文字列が8-Fで始まる16文字であるかどうかを確認し、そうであれば、それを同等の文字に変更します。桁)、結果を解析し、解析された値を符号付きlongの下限に追加しますか? (本質的には2の補数を自分で行うだけです。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top