Convertir une chaîne hexagonale en int en Python
Question
Comment convertir une chaîne hexadécimale en int en Python?
Je peux l'avoir sous la forme "" 0xffff
". ou simplement " ffff
".
La solution
Sans le préfixe 0x, vous devez spécifier explicitement la base, sinon vous ne pouvez pas savoir:
x = int("deadbeef", 16)
Avec le préfixe 0x, Python peut distinguer automatiquement les caractères hexadécimal et décimal.
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
(Vous devez spécifier 0
comme base pour invoquer ce comportement consistant à deviner les préfixes; omettre le deuxième paramètre signifie supposer que la base est 10.)
Autres conseils
int (hexString, 16)
fait l'affaire, et fonctionne avec et sans le préfixe 0x:
>>> int("a", 16)
10
>>> int("0xa",16)
10
Pour toute chaîne donnée s:
int(s, 16)
Convertir une chaîne hexagonale en int en Python
Je peux l'avoir sous la forme
"0xffff"
ou simplement"ffff"
.
Pour convertir une chaîne en un entier, transmettez-la à int
avec la base à partir de laquelle vous effectuez la conversion.
Les deux chaînes suffiront pour la conversion de cette manière:
>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535
Laissant int
en déduire
Si vous passez 0 comme base, int
déduira la base du préfixe de la chaîne.
>>> int(string_1, 0)
65535
Sans le préfixe hexadécimal, 0x
, int
ne dispose pas d'assez d'informations pour pouvoir le deviner:
>>> int(string_2, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'
littéraux:
Si vous tapez dans le code source ou un interpréteur, Python effectuera la conversion pour vous:
>>> integer = 0xffff
>>> integer
65535
Cela ne fonctionnera pas avec ffff
car Python pensera que vous essayez plutôt d'écrire un nom Python légitime:
>>> integer = ffff
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined
Les numéros Python commencent par un caractère numérique, tandis que les noms Python ne peuvent pas commencer par un caractère numérique.
Ajout à la réponse de Dan ci-dessus: si vous fournissez la fonction int () avec une chaîne hexadécimale, vous devrez spécifier la base à 16 ou il ne pensera pas que vous lui avez attribué une valeur valide. Il est inutile de spécifier la base 16 pour les nombres hexadécimaux non contenus dans des chaînes.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
La pire façon:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
S'il vous plaît, ne faites pas ça!
L'utilisation d'eval dans Python est-elle une mauvaise pratique?
Ou ast.literal_eval
(c'est sûr, contrairement à eval
):
ast.literal_eval("0xffff")
Démo:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
En Python 2.7, int ('deadbeef', 10)
ne semble pas fonctionner.
Ce qui suit fonctionne pour moi:
>>a = int('deadbeef',16)
>>float(a)
3735928559.0
L'option de formatage '% x'% semble également fonctionner dans les instructions d'affectation. (En supposant que Python 3.0 et versions ultérieures)
Exemple
a = int('0x100', 16)
print(a) #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
Si vous utilisez l'interpréteur python, vous pouvez simplement taper 0x (votre valeur hexadécimale) et l'interpréteur le convertira automatiquement pour vous.
>>> 0xffff
65535
avec le préfixe '0x', vous pouvez également utiliser la fonction eval
Par exemple
>>a='0xff'
>>eval(a)
255