Risposte:
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.)
int("FFFF",16)essere convertito in -1.
int(hexString, 16) fa il trucco e funziona con e senza il prefisso 0x:
>>> int("a", 16)
10
>>> int("0xa",16)
10
Per una data stringa s:
int(s, 16)
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
intperdereSe 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'
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.
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
Il modo peggiore:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
evalè anche assurdamente lento, oltre a tutti gli altri problemi con esso.
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.
Oppure ast.literal_eval(questo è sicuro, a differenza eval):
ast.literal_eval("0xffff")
demo:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
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
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).
Se stai usando l'interprete Python, puoi semplicemente digitare 0x (il tuo valore esadecimale) e l'interprete lo convertirà automaticamente per te.
>>> 0xffff
65535
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)
con il prefisso '0x', potresti anche usare la funzione eval
Per esempio
>>a='0xff'
>>eval(a)
255
ast.literal_eval.