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
Argumento | valor | Un 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 . |
base | Un 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 retorno | int | Devuelve 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 hexadecimal | Literal decimal |
1 | 1 |
2 | 2 |
4 | 4 |
8 | 8 |
10hex | 16dec |
20hex | 32dec |
40hex | 64dec |
80hex | 128dec |
100hex | 256dec |
200hex | 512dec |
400hex | 1024dec |
800hex | 2048dec |
1000hex | 4096dec |
2000hex | 8192dec |
4000hex | 16384dec |
8000hex | 32768dec |
10000hex | 65536dec |