python

Convertir hexadecimal a decimal en Python

Siguiendo con los tutoriales de programación en Python y la conversión de números hoy vamos a ver cómo convertir un número hexadecimal a decimal. Es decir, convertir un número en base 16 como FF a 255 en base 10.

Para esto vamos a programar la función, y no vamos a usar métodos que el lenguaje ya incorpore. Al final tendremos un código propio que realiza la conversión de hexadecimal a decimal.

Explicación del código

Antes de pasar al verdadero código, veamos cómo funciona el algoritmo. Este programa va a trabajar de la misma manera que los otros que convierten entre bases numéricas (octal a decimal, binario a decimal) salvo por una cosa extra, que son las letras de hexadecimal.

Como sabes, hexadecimal maneja 16 caracteres que son los números del 0 al 9 pero además las letras de la A a la F, por lo que tendremos que crear una función que nos devuelva el valor numérico de cada letra (10 para A, 11 para B).

Después de eso, el algoritmo es simple. Invertimos la cadena porque la debemos recorrer de derecha a izquierda, y como los ciclos solo van de izquierda a derecha, la invertimos para que el recorrido sea de derecha a izquierda según la cadena original.

En cada iteración del ciclo vamos a elevar 16 a la posición del carácter en el que vamos, luego tomamos el dígito hexadecimal, obtenemos su valor numérico y lo multiplicamos por el resultado anteriormente obtenido.

Finalmente vamos acumulando este resultado en el valor decimal que vamos a regresar al final del ciclo. Básicamente el programa ejecuta los siguientes pasos para, por ejemplo, el número FF:

Ingresa un número hexadecimal: FF
Decimal es 0
El verdadero valor de f es 15
Elevamos 16 a la potencia 0, el resultado es 1
Multiplicamos el número elevado por el valor del carácter actual: 15
Ahora decimal es 15
Decimal es 15
El verdadero valor de f es 15
Elevamos 16 a la potencia 1, el resultado es 16
Multiplicamos el número elevado por el valor del carácter actual: 240
Ahora decimal es 255
El hexadecimal FF equivale a 255 en decimal

En caso de que el número sea mayor, se hacen más iteraciones. Ahora que he explicado el funcionamiento y un ejemplo de la ejecución veamos el código.

Código fuente: hexadecimal a decimal en Python

He escrito dos funciones. La primera devuelve el valor numérico a partir de un carácter hexadecimal, y la segunda es la que realmente hace la conversión. Ambas funciones quedan así:

def obtener_valor_real(caracter_hexadecimal):
    equivalencias = {
        "f": 15,
        "e": 14,
        "d": 13,
        "c": 12,
        "b": 11,
        "a": 10,
    }
    if caracter_hexadecimal in equivalencias:
        return equivalencias[caracter_hexadecimal]
    else:
        return int(caracter_hexadecimal)


def hexadecimal_a_decimal(hexadecimal):
    # Convertir a minúsculas para hacer las cosas más simples
    hexadecimal = hexadecimal.lower()
    # La debemos recorrer del final al principio, así que la invertimos
    hexadecimal = hexadecimal[::-1]
    decimal = 0
    posicion = 0
    for digito in hexadecimal:
        print(f"Decimal es {decimal}")
        # Necesitamos que nos dé un 10 para la A, un 9 para el 9, un 11 para la B, etcétera
        valor = obtener_valor_real(digito)
        print(f"El verdadero valor de {digito} es {valor}")
        elevado = 16 ** posicion
        print(
            f"Elevamos 16 a la potencia {posicion}, el resultado es {elevado}")
        equivalencia = elevado * valor
        print(
            f"Multiplicamos el número elevado por el valor del carácter actual: {equivalencia}")
        decimal += equivalencia
        print(f"Ahora decimal es {decimal}")
        posicion += 1
    return decimal

A continuación te enseñaré el modo de uso.

Poniendo todo junto

Puedes invocar a las funciones desde cualquier lugar. Yo haré que se le solicite al usuario un número en base 16 y este programa en Python lo convierta a base 10, es decir, de hexadecimal a decimal. El código completo queda así:

"""
    https://parzibyte.me/blog
"""


def obtener_valor_real(caracter_hexadecimal):
    equivalencias = {
        "f": 15,
        "e": 14,
        "d": 13,
        "c": 12,
        "b": 11,
        "a": 10,
    }
    if caracter_hexadecimal in equivalencias:
        return equivalencias[caracter_hexadecimal]
    else:
        return int(caracter_hexadecimal)


def hexadecimal_a_decimal(hexadecimal):
    # Convertir a minúsculas para hacer las cosas más simples
    hexadecimal = hexadecimal.lower()
    # La debemos recorrer del final al principio, así que la invertimos
    hexadecimal = hexadecimal[::-1]
    decimal = 0
    posicion = 0
    for digito in hexadecimal:
        print(f"Decimal es {decimal}")
        # Necesitamos que nos dé un 10 para la A, un 9 para el 9, un 11 para la B, etcétera
        valor = obtener_valor_real(digito)
        print(f"El verdadero valor de {digito} es {valor}")
        elevado = 16 ** posicion
        print(
            f"Elevamos 16 a la potencia {posicion}, el resultado es {elevado}")
        equivalencia = elevado * valor
        print(
            f"Multiplicamos el número elevado por el valor del carácter actual: {equivalencia}")
        decimal += equivalencia
        print(f"Ahora decimal es {decimal}")
        posicion += 1
    return decimal


hexadecimal = input("Ingresa un número hexadecimal: ")
decimal = hexadecimal_a_decimal(hexadecimal)
print(f"El hexadecimal {hexadecimal} equivale a {decimal} en decimal")

Al ejecutarlo, la salida es correcta. He comprobado el resultado con mi otro conversor de bases numéricas:

Convertir hexadecimal a decimal en Python – Código

En caso de que te guste Python, te invito a leer más posts sobre este lenguaje.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.