85 votes

Java convertit les int en hex et inversement

J'ai le code suivant...

int Val=-32768;
String Hex=Integer.toHexString(Val);

Cela équivaut à ffff8000

int FirstAttempt=Integer.parseInt(Hex,16); // Error "Invalid Int"
int SecondAttempt=Integer.decode("0x"+Hex);  // Error "Invalid Int"

Ainsi, dans un premier temps, il convertit la valeur -32768 en une chaîne hexagonale ffff8000, mais il ne parvient pas à reconvertir la chaîne hexagonale en un nombre entier.

En .Net il fonctionne comme je m'y attendais, et returns -32768 .

Je sais que je pourrais écrire ma propre petite méthode pour convertir cela moi-même, mais je me demande si j'ai raté quelque chose, ou s'il s'agit vraiment d'un bogue ?

79voto

brimborium Points 4563
int val = -32768;
String hex = Integer.toHexString(val);

int parsedResult = (int) Long.parseLong(hex, 16);
System.out.println(parsedResult);

C'est ainsi que vous pouvez le faire.

La raison pour laquelle cela ne fonctionne pas comme vous le souhaitez : Integer.parseInt prend un int signé, tandis que toHexString produit un résultat non signé. Ainsi, si vous insérez quelque chose de plus élevé que 0x7FFFFFF une erreur sera automatiquement générée. Si vous l'interprétez comme long au lieu de cela, il sera toujours signé. Mais lorsque vous le recalculerez en int, il débordera pour atteindre la bonne valeur.

51voto

roni Points 835

Il déborde, car le nombre est négatif.

Essayez ceci et cela fonctionnera :

int n = (int) Long.parseLong("ffff8000", 16);

30voto

  • int à Hex :

    Integer.toHexString(intValue);
  • Hex to int :

    Integer.valueOf(hexString, 16).intValue();

Vous pouvez également utiliser long au lieu de int (si la valeur ne correspond pas à la int ) :

  • Hex to long :

    Long.valueOf(hexString, 16).longValue()
  • long vers Hex

    Long.toHexString(longValue)

11voto

Yuval Sapir Points 136

Il convient de mentionner que Java 8 dispose des méthodes Integer.parseUnsignedInt y Long.parseUnsignedLong qui fait ce que vous vouliez, précisément :

Integer.parseUnsignedInt("ffff8000",16) == -32768

Le nom est un peu déroutant, car il analyse un entier signé à partir d'une chaîne hexagonale, mais il fait le travail.

7voto

maneesh Points 452

Essayez d'utiliser la classe BigInteger, cela fonctionne.

int Val=-32768;
String Hex=Integer.toHexString(Val);

//int FirstAttempt=Integer.parseInt(Hex,16); // Error "Invalid Int"
//int SecondAttempt=Integer.decode("0x"+Hex);  // Error "Invalid Int"
BigInteger i = new BigInteger(Hex,16);
System.out.println(i.intValue());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X