2009-09-11 3 views
11

Wir haben eine J2ME-Anwendung, die Hex-Zahlen lesen muss. Die Anwendung ist für einige Telefone bereits zu groß. Daher versuchen wir, keinen anderen Codec einzuschließen oder unsere eigene Funktion dafür zu schreiben.Negative Long in Hex in Java analysieren

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

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

Wie kann Wir erhalten -1 von dieser Hex-Zeichenfolge mit Klassen in Java selbst zur Verfügung gestellt?

Einige Leute könnten vorschlagen, dass wir unser Hex als -1 schreiben sollten, wie Java erwartet. Entschuldigung, das Format ist durch das Protokoll festgelegt und wir können es nicht ändern.

Antwort

20

Ihr Problem ist, dass parseLong() nicht Zweierkomplement behandelt - es erwartet das Zeichen in Form eines '-' vorhanden sein.

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

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

Aber die CLDC Profil nicht über diese Klasse. Dort ist es wahrscheinlich der einfachste Weg, das zu tun, was Sie brauchen, um das Lange zu teilen, es in zwei Hälften zu zerlegen und neu zu kombinieren. Dies funktioniert:

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

UPDATE

Ab Java 8 können Sie parseUnsignedLong() verwenden:

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

Im schlimmsten Fall könnten Sie prüfen, ob die Zeichenkette aus 16 Zeichen besteht und mit einer 8-F beginnt. Wenn ja, ändern Sie diese in das entsprechende Zeichen ohne das höchstwertige Bit (dh subtrahieren Sie 8 von diese Ziffer), analysieren Sie das Ergebnis und fügen Sie den analysierten Wert der unteren Grenze eines signierten langen? (Im Wesentlichen nur die 2 ergänzen selbst.)

+1

Nicht ganz. Das erste Zeichen könnte von 8-F sein - das wären alle negativ. –

+1

Zweierkomplement negative Zahlen können auch mit E, D, C, B, A, 9 oder 8 beginnen – Avi

+0

Ja, Sie haben Recht. :) – Amber

7

es in Stücke analysieren.

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