Question

Nous avons une application J2ME qui doit lire les nombres hexadécimaux. L’application est déjà trop volumineuse pour certains téléphones. Nous essayons donc de ne pas inclure d’autres codecs ni d’écrire notre propre fonction.

Tous les nombres sont des entiers signés 64 bits au format hexadécimal, lorsque nous utilisons Long.ParseLong (hexadécimal, 16), il gère correctement les nombres positifs, mais il lève une exception sur les nombres négatifs,

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

Comment pouvons-nous obtenir -1 à partir de cette chaîne hexadécimale à l'aide des classes fournies par Java lui-même?

Certaines personnes peuvent suggérer d'écrire notre hexagone sous la forme -1, tel que prévu par Java. Désolé, le format est fixé par le protocole et nous ne pouvons pas le changer.

Était-ce utile?

La solution

Votre problème est que parseLong () ne gère pas le complément à deux - il attend 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()

Mais le profil CLDC n'a pas cette classe. Là, le moyen le plus simple de faire ce dont vous avez besoin est probablement de scinder le long, de 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

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

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

Autres conseils

Analysez-le en morceaux.

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

Dans le pire des cas, vous pouvez vérifier si la chaîne comporte 16 caractères commençant par un 8-F et, dans ce cas, remplacez-la par le caractère équivalent sans le jeu de bits le plus significatif (c.-à-d. soustrayez 8 de ce nombre). digit), analyser le résultat et ajouter la valeur analysée à la limite inférieure d’un signe long? (Essentiellement, faites simplement le complément à deux.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top