Java conversion de int en hex et de retour à nouveau
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"
Donc, d'abord, il convertit la valeur -32768 dans une chaîne hexadécimale de ffff8000, mais il ne peut pas convertir la chaîne hexadécimale de retour dans un Entier.
Dans .Net
il fonctionne comme je m'attends, et returns -32768
.
Je sais que je pourrais écrire ma propre petite méthode pour convertir moi-même, mais je me demande si je suis absent quelque chose, ou si c'est réellement un bug?
- double possible de Java négatif int hex et à l'arrière échoue
- Juste un conseil: en tant Que convention, les noms de variables commencent avec une minuscule:
int firstAttempt = 5;
Vous devez vous connecter pour publier un commentaire.
Il déborde, parce que le nombre est négatif.
Essayer ceci et cela fonctionne:
String Hex=Integer.toHexString("xyz");
comment obtenir le dos de la chaîne de l'hexagone "xyz"C'est comment vous pouvez le faire.
La raison pour laquelle il n'est pas de travailler votre chemin:
Integer.parseInt
prend un signé de type int, alors quetoHexString
produit un unsigned résultat. Donc, si vous insérez quelque chose de plus élevé que0x7FFFFFF
, une erreur sera générée automatiquement. Si vous l'analyser commelong
au lieu de cela, il sera encore signé. Mais quand vous le lancez de retour de type int, il va de dépassement de la valeur correcte.int
Hex :Hex à
int
:Vous pouvez également utiliser
long
au lieu deint
(si la valeur ne correspond pas à laint
de limites):Hex à
long
:long
HexIl vaut la peine de mentionner que Java 8 a les méthodes
Integer.parseUnsignedInt
etLong.parseUnsignedLong
qui fait ce que vous vouliez, en particulier:Integer.parseUnsignedInt("ffff8000",16) == -32768
Le nom est un peu déroutant, car il traite un entier signé à partir d'une chaîne hexadécimale, mais il fait le travail.
Essayez d'utiliser BigInteger classe, il fonctionne.
Comme Un Entier.toHexString(byte/entier) ne fonctionne pas lorsque vous tentez de convertir signé octets comme UTF-16 décodé caractères que vous avez à utiliser:
ou
inverse vous pouvez utiliser
Java de la méthode parseInt est actally un tas de code de manger des "faux" hex : si vous voulez traduire -32768, vous devez convertir la valeur absolue en hexadécimal, puis ajouter la chaîne par un '-'.
Il est un exemple de Integer.java fichier :
La description est tout à fait explicite :
À l'aide de
Integer.toHexString(...)
est une bonne réponse. Mais personnellement, préférez utiliserString.format(...)
.Essayez cet exemple comme un test.
Hehe, curieux. Je pense que c'est un "intentianal bug", pour ainsi dire.
La raison sous-jacente est de savoir comment la classe Integer est écrit. Fondamentalement, parseInt est "optimisé" pour les nombres positifs. Lorsqu'il analyse la chaîne de caractères, il construit le résultat de façon cumulative, mais niée. Puis il retourne le signe du résultat final.
Exemple:
66 = 0x42
analysée comme:
Maintenant, passons à votre exemple
FFFF8000
Modifier (ajout): pour que le parseInt() pour travailler "régulièrement" pour -Entier.MAX_VALUE <= n <= Integer.MAX_VALUE, ils auraient dû mettre en œuvre une logique de "faire tourner" lors de l'atteinte d'un Entier.MAX_VALUE dans le résultat cumulatif, à partir de plus de au max à la fin de l'intervalle entier et continuer vers le bas à partir de là. Pourquoi ils ne l'ont pas fait, on aurait du demander à Josh Bloch ou celui qui l'a mise en œuvre en premier lieu. C'est peut-être une optimisation.
Cependant,
fonctionne bien, justement pour cette raison. Dans le sourcee pour Entier, vous pouvez trouver ce commentaire.
// Accumulating negatively avoids surprises near MAX_VALUE
->, mais il introduit des surprises inférieure à 0 ^^Code ci-dessous devrait fonctionner: