Réponses:
Sans le préfixe 0x, vous devez spécifier la base explicitement, sinon il n'y a aucun moyen de dire:
x = int("deadbeef", 16)
Avec le préfixe 0x, Python peut distinguer automatiquement 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 de préfixation; l'omission du deuxième paramètre signifie assumer la base-10.)
int("FFFF",16)
être converti en -1.
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 hexadécimale en int en Python
Je peux l'avoir comme
"0xffff"
ou juste"ffff"
.
Pour convertir une chaîne en 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
int
inférerSi vous passez 0 comme base, int
déduira la base du préfixe dans la chaîne.
>>> int(string_1, 0)
65535
Sans le préfixe hexadécimal, 0x
, int
ne dispose pas assez d' informations avec lesquelles 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'
Si vous saisissez du code source ou un interpréteur, Python effectuera la conversion pour vous:
>>> integer = 0xffff
>>> integer
65535
Cela ne fonctionnera pas ffff
car Python pensera que vous essayez d'écrire un nom Python légitime à la place:
>>> integer = ffff
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined
Les nombres 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 donné une valeur valide. Il n'est pas nécessaire de spécifier la base 16 pour les nombres hexadécimaux non contenus dans les 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
L'utilisation d'eval en Python est-elle une mauvaise pratique?
eval
est également absurdement lent, en plus de tous les autres problèmes.
int(s,16)
retour de valeurs incorrectes, provoquant des problèmes majeurs avec mon runtime ( int(hex(value),16) == int(value) >>> False
). la chaîne fournie àeval()
était sûre et la valeur renvoyée était correcte.
Ou ast.literal_eval
(c'est sûr, contrairement eval
):
ast.literal_eval("0xffff")
Démo:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
L'option de formatage '% x'% semble également fonctionner dans les instructions d'affectation. (En supposant 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
print(b)
produira 256
, non 100
et print(c)
produira 100
, non 256
. Notez également qu'il c
s'agit d'une chaîne, mais ce a
n'est pas le cas, votre réponse convertit en fait un entier en chaîne, et non l'inverse (c'est de cela qu'il s'agit).
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
Gère hex, octal, binaire, int et flottant
En utilisant les préfixes standard (c'est-à-dire 0x, 0b, 0 et 0o), cette fonction convertira toute chaîne appropriée en nombre. J'ai répondu à ceci ici: https://stackoverflow.com/a/58997070/2464381 mais voici la fonction nécessaire.
def to_number(n):
''' Convert any number representation to a number
This covers: float, decimal, hex, and octal numbers.
'''
try:
return int(str(n), 0)
except:
try:
# python 3 doesn't accept "010" as a valid octal. You must use the
# '0o' prefix
return int('0o' + n, 0)
except:
return float(n)
avec le préfixe «0x», vous pouvez également utiliser la fonction eval
Par exemple
>>a='0xff'
>>eval(a)
255
ast.literal_eval
.