Respuestas:
Sin el prefijo 0x, debe especificar la base explícitamente, de lo contrario no hay forma de saber:
x = int("deadbeef", 16)
Con el prefijo 0x, Python puede distinguir hexadecimal y decimal automáticamente.
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
( Debe especificar 0como base para invocar este comportamiento de adivinación de prefijo; omitir el segundo parámetro significa asumir base-10).
int("FFFF",16)convertirme a -1.
Para cualquier cadena dada s:
int(s, 16)
Convertir cadena hexadecimal a int en Python
Puedo tenerlo como
"0xffff"o solo"ffff".
Para convertir una cadena en un int, pasa la cadena intjunto con la base desde la que estás convirtiendo.
Ambas cadenas serán suficientes para la conversión de esta manera:
>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535
intinferirSi pasa 0 como base, intinferirá la base del prefijo en la cadena.
>>> int(string_1, 0)
65535
Sin el prefijo hexadecimal, 0x, intno tiene suficiente información con la que adivinar:
>>> 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 está escribiendo en el código fuente o en un intérprete, Python hará la conversión por usted:
>>> integer = 0xffff
>>> integer
65535
Esto no funcionará ffffporque Python pensará que estás intentando escribir un nombre legítimo de Python en su lugar:
>>> integer = ffff
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined
Los números de Python comienzan con un carácter numérico, mientras que los nombres de Python no pueden comenzar con un carácter numérico.
Agregando a la respuesta de Dan anterior: si proporciona la función int () con una cadena hexadecimal, tendrá que especificar la base como 16 o no pensará que le dio un valor válido. No es necesario especificar la base 16 para los números hexadecimales no contenidos en las cadenas.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
La peor manera:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
evaltambién es absurdamente lento, además de todos los otros problemas con él.
int(s,16)devolución de valores incorrectos, causando algunos problemas importantes con mi tiempo de ejecución ( int(hex(value),16) == int(value) >>> False). la cadena suministrada a eval()era segura y el valor devuelto era correcto.
O ast.literal_eval(esto es seguro, a diferencia eval):
ast.literal_eval("0xffff")
Manifestación:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
La opción de formateador '% x'% parece funcionar también en las declaraciones de asignación para mí. (Suponiendo Python 3.0 y posterior)
Ejemplo
a = int('0x100', 16)
print(a) #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
print(b)dará salida 256, no 100y print(c)dará salida 100, no 256. También tenga en cuenta que ces una cadena, pero ano es así, su respuesta en realidad convierte un int en una cadena, y no al revés (de esto se trata la pregunta).
Si está utilizando el intérprete de Python, puede escribir 0x (su valor hexadecimal) y el intérprete lo convertirá automáticamente.
>>> 0xffff
65535
Maneja hexadecimal, octal, binario, int y flotante
Usando los prefijos estándar (es decir, 0x, 0b, 0 y 0o) esta función convertirá cualquier cadena adecuada a un número. Respondí esto aquí: https://stackoverflow.com/a/58997070/2464381 pero aquí está la función necesaria.
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 el prefijo '0x', también puede usar la función eval
Por ejemplo
>>a='0xff'
>>eval(a)
255
ast.literal_eval.