Convertir une chaîne hexadécimale en int en Python


766

Comment convertir une chaîne hexadécimale en int en Python?

Je peux l'avoir comme " 0xffff" ou simplement " ffff".

Réponses:


1087

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 0comme base pour invoquer ce comportement de préfixation; l'omission du deuxième paramètre signifie assumer la base-10.)


25
Ce qui signifie que vous devez toujours utiliser 16 comme deuxième argument. Explicite vaut mieux qu'implicite.
Bachsau

13
@bachsau, clairement faux. Que se passe-t-il si vous souhaitez lire les entrées utilisateur, autorisant la saisie en hexadécimal ou décimal, selon ce qui convient à l'utilisateur?
Dan Lenski

7
D'accord, j'aurais dû dire: dans ce cas particulier! La question d'origine était "Comment convertir une chaîne hexagonale…". Si vous voulez le laisser à l'utilisateur, c'est une fonctionnalité utile, avec cela, vous avez raison.
Bachsau

@DanLenski, il convertit toujours les chaînes hexadécimales en nombres positifs. Je veux int("FFFF",16)être converti en -1.
Nazar

@Nazar, cela fait longtemps, donc cela n'est probablement pas utile pour vous à ce stade, mais pour toute autre personne qui trébuche ici, si l'application des règles de complément des deux est requise. Cette réponse peut aider stackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy

163

int(hexString, 16) fait l'affaire et fonctionne avec et sans le préfixe 0x:

>>> int("a", 16)
10
>>> int("0xa",16)
10


43

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 intavec 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

Laisser intinférer

Si vous passez 0 comme base, intdéduira la base du préfixe dans la chaîne.

>>> int(string_1, 0)
65535

Sans le préfixe hexadécimal, 0x, intne 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'

littéraux:

Si vous saisissez du code source ou un interpréteur, Python effectuera la conversion pour vous:

>>> integer = 0xffff
>>> integer
65535

Cela ne fonctionnera pas ffffcar 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.


Il vaut la peine de répéter "Laisser int déduire Si vous passez 0 comme base, int déduira la base du préfixe dans la chaîne." Comment convertir de hexadécimal ou décimal (ou binaire) en entier comme le fait l'interpréteur python.
gaoithe

13

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

5

La pire façon:

>>> def hex_to_int(x):
    return eval("0x" + x)

>>> hex_to_int("c0ffee")
12648430

Veuillez ne pas faire ça!

L'utilisation d'eval en Python est-elle une mauvaise pratique?


3
Il convient de noter que cela evalest également absurdement lent, en plus de tous les autres problèmes.
j6m8

4
Si c'est une mauvaise idée, alors à quoi bon en parler?
pppery

3
Bon point. En partie parce que je pense que c'est drôle et en partie parce que je l'ai vu dans le code de production.
André Laszlo

Je devrais probablement noter que je faisais cela après avoir rencontré des problèmes avec le 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.
Tcll

1
j'ai trouvé que c'était drôle et instructif, je suis content qu'il ait été posté
frogeyedpeas

3

Ou ast.literal_eval(c'est sûr, contrairement eval):

ast.literal_eval("0xffff")

Démo:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

1

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

Les commentaires sont incorrects. print(b)produira 256, non 100et print(c)produira 100, non 256. Notez également qu'il cs'agit d'une chaîne, mais ce an'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).
André Laszlo

Merci pour votre contribution, je conviens que ma réponse n'est pas correcte, et maintenant je l'ai corrigée. Cependant, je me rends compte qu'une partie de la réponse est redondante comme ci-dessus, c'est-à-dire en utilisant int (chaîne, base), mais le reste de la réponse ajoute encore plus d'options au message, je crois. Se mettre d'accord ?
Soundararajan

Non pertinent; il s'agit de passer de la base 16 à la base 10, et non l'inverse
pppery

1

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

1

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)

-1

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

4
Comment cela répond-il à la question?
pppery

-5

avec le préfixe «0x», vous pouvez également utiliser la fonction eval

Par exemple

>>a='0xff'
>>eval(a)
255

16
Assurez-vous que la validation des entrées est effectuée correctement si vous utilisez eval. En fait, il existe probablement un meilleur moyen. N'utilisez pas eval.
ALOToverflow

7
À tout le moins , vous devriez utiliser ast.literal_eval.
Andy Hayden

2
Aussi très lent. La pire façon jamais.
Tõnu Samuel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.