Pregunta

¿Cómo convierto una cadena hexadecimal a un int en Python?

Puedo tenerlo como " 0xffff " o simplemente " ffff " ;.

¿Fue útil?

Solución

Sin el prefijo 0x, debe especificar la base explícitamente, de lo contrario no hay forma de saberlo:

x = int("deadbeef", 16)

Con el prefijo 0x, Python puede distinguir el hex y el decimal automáticamente.

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

(Usted debe debe especificar 0 como la base para invocar este comportamiento de adivinación de prefijos; omitir el segundo parámetro significa asumir base-10).

Otros consejos

int (hexString, 16) hace el truco y funciona con y sin el prefijo 0x:

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

Para cualquier cadena dada s:

int(s, 16)
  

Convierte una cadena hexadecimal a int en Python

     

Puedo tenerlo como " 0xffff " o simplemente " ffff " .

Para convertir una cadena en un int, pase la cadena a int junto con la base desde la que está 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

Dejando int inferir

Si 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 para 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'

literales:

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á con 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 suministra la función int () con una cadena hexadecimal, deberá especificar la base como 16 o no pensará que le dio un valor válido. Especificar la base 16 no es necesario para los números hexadecimales que no están contenidos en 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

¡No hagas esto!

¿Usar eval en Python es una mala práctica?

O ast.literal_eval (esto es seguro, a diferencia de eval ):

ast.literal_eval("0xffff")

Demo:

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

En Python 2.7, int ('deadbeef', 10) no parece funcionar.

Lo siguiente funciona para mí:

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

La opción del 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

Si está utilizando el intérprete de Python, puede escribir 0x (su valor hexadecimal) y el intérprete lo convertirá automáticamente por usted.

>>> 0xffff

65535

con el prefijo '0x', también puede usar la función eval

Por ejemplo

>>a='0xff'
>>eval(a)
255
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top