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

Rate this post
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