Subir un archivo
  1. base64hub
  2. Otras bases
  3. Base45

Codificador y decodificador Base45 (RFC 9285)

Escribe texto para obtener Base45 RFC 9285, formado por los 45 caracteres que un código QR guarda en modo alfanumérico. Invierte la dirección para decodificar Base45, por ejemplo la parte de un certificado sanitario HC1: que sigue al prefijo.

Gratis sin registro, sin límites Local no se sube nada RFC 9285 reproduce todos los ejemplos de la RFC Actualizado 27 oct 2026
Entrada 0Bytes 0 BSalida 0

Se procesa en tu navegador. Esta página no puede enviar tus datos a ninguna parte – cómo lo sabemos

Cómo codificar y decodificar Base45

  1. Escribe o pega texto en Entrada · Texto. La cadena Base45 aparece en Salida · Base45 (RFC 9285).
  2. Para datos binarios, como bytes comprimidos, pon antes De en Hex o Base64.
  3. Para decodificar, haz clic en Base45 (RFC 9285) → Texto en el selector de dirección y pega la cadena. Elige Hex o Base64 en A si el resultado es binario, como ocurre con los certificados sanitarios.
  4. Copiar salida conserva los espacios. Guardar bytes descarga los bytes decodificados como archivo.

Cómo funciona Base45

RFC 9285 toma la entrada de dos en dos bytes. Cada par es un número n de 0 a 65535, que se escribe como tres dígitos en base 45 c, d, e con n = c + d × 45 + e × 45², empezando por el menos significativo. Un último byte suelto se convierte en dos dígitos. El alfabeto es el juego alfanumérico de los códigos QR, en orden:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:

Los ejemplos de la RFC, todos reproducidos con esta herramienta:

EntradaBase45
ABBB8
Hello!!%69 VD92EX0
base-45UJCLQE7W581
ietf!QED8WEX0

Al decodificar se comprueban dos cosas que un decodificador permisivo podría pasar por alto: una longitud de 3n + 1 no puede salir de ninguna entrada, y un grupo mayor que 65535 (como GGW o ZZZ) está fuera de rango. Ambos casos dan error.

Por qué Base45 encaja con los códigos QR

Sobre el papel, Base45 parece un derroche: 3 caracteres por cada 2 bytes es un 50 % más de tamaño, más que el 33 % de Base64. La diferencia está en cómo guardan el texto los códigos QR. En modo alfanumérico, un código QR empaqueta dos de estos 45 caracteres en 11 bits. Así, tres caracteres Base45 cuestan 16,5 bits por 16 bits de datos, alrededor de un 3 % más.

Base64 no puede usar el modo alfanumérico porque necesita letras minúsculas. Tiene que ir en modo byte, a 8 bits por carácter, lo que supone un 33 % más dentro del código QR. Con los mismos datos, el código QR en Base45 es más pequeño o cabe más información.

Decodificar un Certificado COVID Digital de la UE (HC1:)

El código QR del Certificado COVID Digital de la UE contiene una cadena que empieza por HC1:. La carga útil se construye por capas, y esta página se ocupa de una de ellas:

  1. Quita el prefijo HC1:. H, C, 1 y : son caracteres Base45 válidos, así que si dejas el prefijo se decodifica como datos y estropea todo lo que viene después.
  2. Decodifica el Base45 del resto aquí, con A en Base64.
  3. Descomprime el resultado. Son datos zlib, que empiezan por el byte 78 (eJ o eN en Base64). Pega el Base64 en el decodificador gzip y zlib.
  4. Analiza el CBOR. Los bytes descomprimidos son una estructura COSE_Sign1 en CBOR: una cabecera, la carga útil con los campos del certificado y una firma. Eso requiere un decodificador CBOR, que este sitio no tiene.

Decodificar muestra el contenido, pero no verifica la firma. Para comprobar que un certificado es auténtico hacen falta la clave pública del país emisor y un verificador COSE.

Base45 en Python

Python no tiene un módulo Base45 en la biblioteca estándar. El codificador sigue la RFC al pie de la letra:

ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"

def b45encode(data: bytes) -> str:
    out = []
    for i in range(0, len(data) - 1, 2):
        n = data[i] * 256 + data[i + 1]
        c, n = n % 45, n // 45
        d, e = n % 45, n // 45
        out += ALPHABET[c], ALPHABET[d], ALPHABET[e]
    if len(data) % 2:
        c, d = data[-1] % 45, data[-1] // 45
        out += ALPHABET[c], ALPHABET[d]
    return "".join(out)

b45encode(b"ietf!")    # 'QED8WEX0'

El paquete base45 de PyPI ofrece ambas direcciones. Para más manejo de bytes en Python, consulta la página de Python.

Preguntas frecuentes

¿Por qué la salida Base45 tiene espacios?

El espacio es uno de los 45 caracteres del juego alfanumérico de QR, así que en Base45 es un dígito normal con el valor 36. Hello!! se codifica como %69 VD92EX0. Conserva los espacios al copiar y no dejes que un formulario o una shell los recorten.

¿Puedo decodificar aquí un Certificado COVID Digital de la UE?

En parte. Esta página hace el paso de Base45. Después, los datos son CBOR comprimido con zlib dentro de una estructura COSE firmada, que necesita un paso de descompresión y un decodificador CBOR; los pasos se detallan en esta página.

¿Se puede poner Base45 en una URL sin problemas?

No. El espacio, %, + y / forman parte del alfabeto y todos significan algo en las URLs. Aplica codificación por porcentajes a la cadena o usa Base64URL para URLs.

¿Por qué se rechaza mi cadena Base45?

Un Base45 válido tiene una longitud de 3n o 3n + 2 caracteres, y cada grupo de 3 caracteres debe valer como máximo 65535. Una longitud de 3n + 1, o un grupo como GGW, es un error. Una causa habitual es haber dejado el prefijo HC1:.