Frage

Wir haben eine J2ME-Anwendung, die Hex-Zahlen lesen muss. Die Anwendung ist bereits zu groß für einige Telefone so wir nicht versuchen, eine andere Codec enthalten oder unsere eigene Funktion schreiben, dies zu tun.

Alle Zahlen sind 64-Bit-Integer mit Vorzeichen in hex, wenn wir Long.ParseLong (hex, 16) zu verwenden, es positive Zahlen richtig behandelt, aber es wirft Ausnahme auf negative Zahlen,

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

Wie können wir -1 aus dieser Hex-String-Klassen in Java zur Verfügung gestellt mit sich selbst?

Einige Leute können empfehlen wir unsere hex schreiben sollte als -1 als Java erwartet. Leider wird das Format durch das Protokoll festgelegt und wir können es nicht ändern.

War es hilfreich?

Lösung

Ihr Problem ist, dass parseLong() nicht Zweierkomplement umgehen kann - es erwartet, dass die Zeichen in Form eines sein ‚-‘.

Wenn Sie die CDC-Profil sind die Entwicklung, können Sie einfach Gebrauch

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

Aber das CLDC Profil nicht über diese Klasse. der einfachste Weg, es zu tun, was Sie brauchen, ist wahrscheinlich die lange aufzuspalten, analysieren sie in zwei Hälften und rekombinieren sie. Dies funktioniert:

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

UPDATE

Wie von Java 8 können Sie parseUnsignedLong() :

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

Andere Tipps

Parse es in Stücke schneiden.

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

Schlimmer Fall könnten Sie überprüfen, ob die Zeichenfolge 16 Zeichen ist, die mit einem 8-F beginnt, und wenn ja, daß w in den entsprechenden Zeichen ändern / o der höchstwertigen Bit gesetzt (dh subtrahieren 8 von denjenigen digit), analysieren das Ergebnis, und fügen Sie den analysierten Wert auf die untere Grenze eines signierten lange? (Im Wesentlichen nur das tut, 2 selbst ergänzen.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top