Cómo convertir una cadena hexadecimal en un entero en Python

How to Convert Hex String to Integer in Python

Planteamiento del problema

Dada una cadena en forma hexadecimal:

s = '0xff'
# or: s = 'ff'

Cómo convertir una cadena hexadecimal en un entero en Python

Por ejemplo, quieres convertir la cadena hexadecimal '0xff' en el entero decimal 255.

Aquí hay otros ejemplos:

0x0   -->   0
0x4   -->   4
0x8   -->   8
0x12   -->   18
0x16   -->   22
0x20   -->   32
0x24   -->   36
0x28   -->   40

Cadena hexadecimal a entero usando int() con base 16

Para convertir una cadena hexadecimal en un entero, pasa la cadena como primer argumento a la función incorporada de Python int(). Utiliza base=16 como segundo argumento de la función int() para especificar que la cadena dada es un número hexadecimal. La función int() convertirá la cadena hexadecimal en un entero en base 10 y devolverá el resultado.

Este es un ejemplo mínimo:

>>> int('0xff', base=16)
255

Ejemplos

Y así es como puedes convertir los ejemplos adicionales mostrados anteriormente:

>>> int('0x0', base=16)
0
>>> int('0x4', base=16)
4
>>> int('0x8', base=16)
8
>>> int('0x12', base=16)
18
>>> int('0x16', base=16)
22
>>> int('0x20', base=16)
32
>>> int('0x24', base=16)
36
>>> int('0x28', base=16)
40

En realidad no necesitas usar el prefijo '0x' porque tu segundo argumento ya define inequívocamente que la cadena dada es un número hexadecimal:

>>> int('0', base=16)
0
>>> int('4', base=16)
4
>>> int('8', base=16)
8
>>> int('12', base=16)
18
>>> int('16', base=16)
22
>>> int('20', base=16)
32
>>> int('24', base=16)
36
>>> int('28', base=16)
40

Sin embargo, al omitir la base pero dejar el prefijo se produce un ValueError: invalid literal for int() with base 10: '0x28':

>>> int('0x28')
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    int('0x28')
ValueError: invalid literal for int() with base 10: '0x28'

Supone que la cadena de entrada está en base 10 cuando en realidad no lo está.

? Nota: Aunque pasar una cadena prefijada '0x...' a la función int() no es ambiguo, la función int() de Python no la acepta si no defines también la base. Es posible que esto se arregle en futuras versiones.

De hecho, puedes especificar el argumento base como 0 para activar la suposición de la base, ¡que debería ser el comportamiento por defecto!

Suposición de la base

Puedes pasar una cadena con prefijo '0x...' a la función int() y establecer la base en 0 para activar la suposición de base en Python. Esto utiliza el prefijo para determinar la base automáticamente, sin que tengas que ponerlo en 16. Aun así, tienes que ponerlo en 0, por lo que el beneficio es insignificante en la práctica.

>>> int('0x9', base=16)
9
>>> int('0x9', base=0)
9
>>> int('0x9', 0)
9

Conversión de literales hexadecimales a enteros

Si no tienes una cadena hexadecimal sino un número hexadecimal -llamado literal- como 0xff, ni siquiera necesitas la función int() porque Python lo convertirá automáticamente en un número decimal:

>>> 0x10
16
>>> 0xff
255

Trasfondo de int()

Sintaxis: int(valor [, base])    -->   int

ArgumentovalorUn objeto de Python a convertir en un número entero. El objeto value debe tener un método __int__() que devuelva el número entero asociado; de lo contrario, se producirá un TypeError.
baseUn argumento entero opcional base para definir la base del sistema numérico del argumento value. Si estableces una base, el argumento value debe ser una cadena. El argumento base determina cómo se interpreta el argumento de cadena.
Valor de retornointDevuelve un número entero después de convertir el argumento de entrada value utilizando su método __int__() necesario para la conversión.

¿Todavía necesitas más información de fondo sobre la función incorporada de Python int()? No hay problema, lee el tutorial relacionado.

Tutorial relacionado: Función int() incorporada de Python

Tabla de Hex a Int

Sólo por diversión, aquí están las conversiones de hex a int de las potencias de dos:

Literal hexadecimalLiteral decimal
11
22
44
88
10hex16dec
20hex32dec
40hex64dec
80hex128dec
100hex256dec
200hex512dec
400hex1024dec
800hex2048dec
1000hex4096dec
2000hex8192dec
4000hex16384dec
8000hex32768dec
10000hex65536dec