2009-09-11 9 views
11

Nous avons une application J2ME qui a besoin de lire les nombres hexadécimaux. L'application est déjà trop grande pour certains téléphones donc nous essayons de ne pas inclure d'autre codec ou d'écrire notre propre fonction pour le faire.Comment analyser long négatif en hexadécimal en Java

Tous les chiffres sont 64 bits entiers signés en hexadécimal, lorsque nous utilisons Long.ParseLong (hex, 16), il gère correctement les nombres positifs, mais il émet une exception sur les nombres négatifs,

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

Comment nous obtenons -1 à partir de cette chaîne hexadécimale en utilisant les classes fournies dans Java lui-même?

Certaines personnes peuvent suggérer que nous devrions écrire notre hex comme -1 attendu Java. Désolé, le format est fixé par le protocole et nous ne pouvons pas le changer.

Répondre

20

Votre problème est que parseLong() ne gère pas le complément à deux - il s'attend à ce que le signe soit présent sous la forme d'un '-'.

Si vous développez pour le profil CDC, vous pouvez utiliser simplement

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

le profil CLDC n'a pas cette classe. Là, le moyen le plus facile de faire ce dont vous avez besoin est probablement de séparer le long, l'analyser en deux et de le recombiner. Cela fonctionne:

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

MISE À JOUR

A partir de Java 8, vous pouvez utiliser parseUnsignedLong():

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

Dans le pire des cas, vous pouvez vérifier si la chaîne comporte 16 caractères commençant par un 8-F, et si oui, remplacez-la par le caractère équivalent sans l'ensemble de bits le plus significatif (c'est-à-dire ce chiffre), analyser le résultat et ajouter la valeur analysée à la limite inférieure d'un long signé? (Le simple fait de compléter les 2 vous-même.)

+1

Pas tout à fait. Le premier personnage pourrait être de 8-F - ceux-ci seraient tous négatifs. –

+1

Les nombres négatifs du complément à deux peuvent également commencer par E, D, C, B, A, 9 ou 8 – Avi

+0

Oui, vous avez raison. :) – Amber

7

Parse en morceaux.

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