Come analizzare Long Negative in esadecimale in Java
Domanda
Abbiamo un'applicazione J2ME che deve leggere numeri esadecimali. L'applicazione è già troppo grande per alcuni telefoni, quindi cerchiamo di non includere altri codec o di scrivere le nostre funzioni per farlo.
Tutti i numeri sono numeri interi con segno a 64 bit in esadecimale, quando utilizziamo Long.ParseLong (hex, 16), gestisce correttamente i numeri positivi ma genera un'eccezione sui numeri negativi,
long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);
Come possiamo ottenere -1 da quella stringa esadecimale usando le classi fornite in Java stesso?
Alcune persone potrebbero suggerire che dovremmo scrivere il nostro esagono come -1 come previsto da Java. Spiacenti, il formato è fissato dal protocollo e non possiamo modificarlo.
Soluzione
Il tuo problema è che parseLong ()
non gestisce il complemento a due: si aspetta che il segno sia presente sotto forma di un '-'.
Se stai sviluppando per il profilo CDC, puoi semplicemente utilizzare
long l = new BigInteger("FFFFFFFFFFFFFFFF", 16).longValue()
Ma il profilo CLDC non ha quella classe. Lì, il modo più semplice per fare ciò di cui hai bisogno è probabilmente quello di dividere il lungo, analizzarlo in due metà e ricombinarli. Questo funziona:
long msb = Long.parseLong("FFFFFFFF", 16);
long lsb = Long.parseLong("FFFFFFFF", 16);
long result = msb<<32 | lsb;
Aggiorna
A partire da Java 8, è possibile utilizzare parseUnsignedLong ()
:
long l = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);
Altri suggerimenti
Analizzalo a pezzi.
long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);
Caso peggiore, è possibile verificare se la stringa ha 16 caratteri che iniziano con un 8-F e, in tal caso, cambiarla con il carattere equivalente senza il set di bit più significativo (ovvero sottrarre 8 da quello digit), analizzare il risultato e aggiungere il valore analizzato al limite inferiore di un long con segno? (Essenzialmente, fai solo tu stesso il complemento a 2.)