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.

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top