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 0
como 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 int
junto 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
int
inferirSi pasa 0 como base, int
inferirá la base del prefijo en la cadena.
>>> int(string_1, 0)
65535
Sin el prefijo hexadecimal, 0x
, int
no 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á ffff
porque 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
eval
tambié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 100
y print(c)
dará salida 100
, no 256
. También tenga en cuenta que c
es una cadena, pero a
no 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
.