Converti stringa esadecimale in int in Python


766

Come faccio a convertire una stringa esadecimale in un int in Python?

Potrei averlo come " 0xffff" o semplicemente " ffff".

Risposte:


1087

Senza il prefisso 0x, è necessario specificare esplicitamente la base, altrimenti non c'è modo di dire:

x = int("deadbeef", 16)

Con il prefisso 0x, Python può distinguere automaticamente esadecimale e decimale.

>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10

necessario specificare 0come base per invocare questo comportamento di indovinare prefisso; omettere il secondo parametro significa assumere base-10.)


25
Ciò significa che dovresti sempre usare 16 come secondo argomento. Esplicito è meglio che implicito.
Bachsau,

13
@bachsau, chiaramente falso. Cosa succede se si desidera leggere l'input dell'utente, consentendo l'input in formato esadecimale o decimale, a seconda di quale sia conveniente per l'utente?
Dan Lenski,

7
Ok, avrei dovuto dire: in questo caso particolare! La domanda originale era "Come faccio a convertire una stringa esadecimale ...". Se vuoi lasciarlo all'utente, allora è una funzione utile, con quello hai ragione.
Bachsau,

@DanLenski, converte sempre le stringhe esadecimali in numeri positivi. Voglio int("FFFF",16)essere convertito in -1.
Nazar

@Nazar è passato molto tempo, quindi a questo punto probabilmente non è utile per te, ma per chiunque altro si imbattesse qui, se è richiesta l'applicazione delle regole del complemento a due. Questa risposta può aiutare stackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy

163

int(hexString, 16) fa il trucco e funziona con e senza il prefisso 0x:

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


43

Converti stringa esadecimale in int in Python

Potrei averlo come "0xffff"o solo "ffff".

Per convertire una stringa in un int, passa la stringa intinsieme alla base da cui stai convertendo.

Entrambe le stringhe saranno sufficienti per la conversione in questo modo:

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

Lasciar intperdere

Se passi 0 come base, intinferirà la base dal prefisso nella stringa.

>>> int(string_1, 0)
65535

Senza il prefisso esadecimale, 0x, intnon avere abbastanza informazioni con le quali da indovinare:

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

letterali:

Se stai digitando nel codice sorgente o in un interprete, Python eseguirà la conversione per te:

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

Questo non funzionerà ffffperché Python penserà che stai cercando di scrivere un nome Python legittimo:

>>> integer = ffff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined

I numeri Python iniziano con un carattere numerico, mentre i nomi Python non possono iniziare con un carattere numerico.


Vale la pena ripetere "Lettere int infer Se si passa 0 come base, int inferirà la base dal prefisso nella stringa." Come convertire da esadecimali o decimali (o binari) in numeri interi come fa l'interprete python.
Goao

13

Aggiungendo alla risposta di Dan sopra: se fornisci alla funzione int () una stringa esadecimale, dovrai specificare la base come 16 o non penserà di averle dato un valore valido. Non è necessario specificare la base 16 per i numeri esadecimali non contenuti nelle stringhe.

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid

5

Il modo peggiore:

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

>>> hex_to_int("c0ffee")
12648430

Per favore, non farlo!

Usare eval in Python è una cattiva pratica?


3
Vale la pena notare che evalè anche assurdamente lento, oltre a tutti gli altri problemi con esso.
j6m8

4
Se questa è una cattiva idea, allora che senso ha tirarla fuori?
pppery

3
Buon punto. In parte perché penso che sia divertente e in parte perché l'ho visto nel codice di produzione.
André Laszlo,

Dovrei probabilmente notare che ero solito farlo dopo aver riscontrato problemi con la int(s,16)restituzione di valori non corretti, causando alcuni problemi importanti con il mio runtime ( int(hex(value),16) == int(value) >>> False). la stringa fornita a eval()era sicura e il valore restituito era corretto.
Fino al

1
ho trovato questo divertente e illuminante, sono contento che sia stato pubblicato
frogeyedpeas

3

Oppure ast.literal_eval(questo è sicuro, a differenza eval):

ast.literal_eval("0xffff")

demo:

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

1

L'opzione di formattazione '% x'% sembra funzionare anche nelle dichiarazioni di assegnazione per me. (Supponendo Python 3.0 e versioni successive)

Esempio

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100

I commenti non sono corretti print(b)produrrà 256, non 100e print(c)produrrà 100, no 256. Nota anche che cè una stringa, ma anon è così la tua risposta in realtà converte un int in una stringa, non viceversa (questo è di cosa tratta la domanda).
André Laszlo,

Grazie per il tuo contributo, sono d'accordo che la mia risposta non è corretta e ora l'ho risolto. Tuttavia, mi rendo conto che parte della risposta è ridondante come sopra, ovvero utilizzando int (stringa, base), ma credo che il resto della risposta aggiunga più opzioni al post. Essere d'accordo ?
Soundararajan,

Non rilevante; si tratta di convertire dalla base 16 alla base 10, non viceversa
pepery

1

Se stai usando l'interprete Python, puoi semplicemente digitare 0x (il tuo valore esadecimale) e l'interprete lo convertirà automaticamente per te.

>>> 0xffff

65535

1

Gestisce hex, ottale, binario, int e float

Utilizzando i prefissi standard (ovvero 0x, 0b, 0 e 0o) questa funzione convertirà qualsiasi stringa adatta in un numero. Ho risposto qui: https://stackoverflow.com/a/58997070/2464381 ma ecco la funzione necessaria.

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

In Python 2.7, int('deadbeef',10) non sembra funzionare.

Per me funziona quanto segue:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0

4
Come risponde alla domanda?
pppery

-5

con il prefisso '0x', potresti anche usare la funzione eval

Per esempio

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

16
Assicurarsi che la convalida dell'input sia eseguita correttamente se si utilizza eval. In effetti, c'è probabilmente un modo migliore. Non usare eval.
ALOToverflow

7
Per lo meno si dovrebbe usare ast.literal_eval.
Andy Hayden,

2
Anche molto lento. Il peggior modo di sempre.
Tõnu Samuel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.