J'essaie de convertir une chaîne de 8 caractères de code hexadécimal en un entier afin de pouvoir faire une comparaison int au lieu de comparaisons de chaînes sur un grand nombre de valeurs différentes.
Je sais que c'est assez trivial en C ++ mais je dois le faire en Java. Le cas de test que je dois satisfaire est essentiellement de convertir "AA0F245C" en int, puis de revenir à cette chaîne pour que je sache que la conversion est correcte.
J'ai essayé ce qui suit:
int decode = Integer.decode("0xAA0F245C"); // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException
J'ai également essayé de le faire deux caractères à la fois et de multiplier les résultats, ce que la conversion fonctionne mais le nombre n'est pas correct.
int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
String sub = hex.subSequence(h, h+2).toString();
if (id == 0)
id = Integer.valueOf(sub, 16);
else
id *= Integer.valueOf(sub, 16);
}
//ID = 8445600 which = 80DEA0 if I convert it back.
Je ne peux pas utiliser de bibliothèques tierces juste pour que vous le sachiez, donc cela doit être fait dans les bibliothèques standard Java.
Merci d'avance pour votre aide.
0xAA0F245C = 2853119068
butInteger.MAX_VALUE = 0x7fffffff = 2147483647
Integer.parseUnsignedInt("value",radix)
méthode qui sert votre objectif. Si la valeur est supérieure àInteger.MAX_VALUE
celle-ci, elle est mappée à un nombre négatif.Réponses:
C'est tout simplement trop gros pour un int (qui fait 4 octets et est signé).
Utilisation
la source
NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
... Solution?BigInteger
classe comme ceci:BigInteger value = new BigInteger(valueString, 16)
vous pouvez utiliser comme ça
la source
La valeur maximale qu'un Java
Integer
peut gérer est 2147483657, ou 2 ^ 31-1. Le nombre hexadécimal AA0F245C est 2853119068 sous forme de nombre décimal, et est beaucoup trop grand, vous devez donc utiliserpour le faire fonctionner.
la source
vous pouvez facilement le faire avec parseInt avec le paramètre de format.
javadoc Integer
la source
Voici la bonne réponse:
myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)
la source
Pour ceux d'entre vous qui ont besoin de convertir une représentation hexadécimale d'un octet signé d'une chaîne à deux caractères en octet (qui en Java est toujours signé), il existe un exemple. L'analyse d'une chaîne hexadécimale ne donne jamais de nombre négatif, ce qui est erroné, car 0xFF est -1 d'un certain point de vue (codage du complément à deux). Le principe est d'analyser la chaîne entrante en tant que int, qui est plus grand que byte, puis d'envelopper les nombres négatifs. Je ne montre que des octets, donc cet exemple est assez court.
Cela peut être modifié pour traiter des nombres plus longs. Ajoutez simplement plus de FF ou de 00 respectivement. Pour analyser les entiers signés à 8 caractères hexadécimaux, vous devez utiliser Long.parseLong, car FFFF-FFFF, qui est entier -1, ne rentrerait pas dans Integer lorsqu'il est représenté sous forme de nombre positif (donne 4294967295). Vous avez donc besoin de Long pour le stocker. Après la conversion en nombre négatif et la conversion en nombre entier, il s'adaptera. Il n'y a pas de chaîne hexadécimale de 8 caractères, qui ne correspondrait pas à un entier à la fin.
la source
Une option supplémentaire à celles suggérées est d'utiliser la
BigInteger
classe. Comme les valeurs hexadécimales sont souvent de grands nombres, tels que les valeurs sha256 ou sha512, elles déborderont facilement de anint
et along
. Bien que la conversion en tableau d'octets soit une option comme le montrent d'autres réponsesBigInterger
, la classe souvent oubliée en java est également une option.la source
la source
Essayez avec ceci:
long abc = convertString2Hex ("1A2A3B");
la source