Enviar um arquivo
  1. base64hub
  2. Outras bases
  3. Base45

Codificador e decodificador Base45 (RFC 9285)

Digite um texto para obter Base45 da RFC 9285, formado pelos 45 caracteres que um QR code armazena no modo alfanumérico. Inverta a direção para decodificar Base45, por exemplo a parte de um certificado de saúde HC1: depois do prefixo.

Grátis sem cadastro, sem limites Local nada é enviado RFC 9285 todos os exemplos da RFC reproduzidos Atualizado 27 de out. de 2026
Entrada 0Bytes 0 BSaída 0

Processado no seu navegador. Esta página não consegue enviar seus dados para lugar nenhum – como sabemos

Como codificar e decodificar Base45

  1. Digite ou cole o texto em Entrada · Texto. A string Base45 aparece em Saída · Base45 (RFC 9285).
  2. Para dados binários, como bytes compactados, ajuste antes De em Hex ou Base64.
  3. Para decodificar, clique em Base45 (RFC 9285) → Texto no seletor de direção e cole a string. Escolha Hex ou Base64 em Para se o resultado for binário, o que acontece com certificados de saúde.
  4. Copiar saída mantém os espaços intactos. Salvar bytes baixa os bytes decodificados como arquivo.

Como o Base45 funciona

A RFC 9285 lê a entrada de dois em dois bytes. Cada par é um número n de 0 a 65535, escrito como três dígitos em base 45, c, d, e, com n = c + d × 45 + e × 45², do menos significativo para o mais significativo. Um byte único no final vira dois dígitos. O alfabeto é o conjunto alfanumérico do QR code, em ordem:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:

Os exemplos da RFC, todos reproduzidos por esta ferramenta:

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

A decodificação verifica duas coisas que um decodificador tolerante poderia pular: um comprimento de 3n + 1 não pode vir de nenhuma entrada, e um grupo acima de 65535 (como GGW ou ZZZ) está fora do intervalo. Os dois casos dão erro.

Por que o Base45 combina com QR codes

No papel, o Base45 parece um desperdício: 3 caracteres para cada 2 bytes é 50% de acréscimo, mais que os 33% do Base64. A diferença está em como os QR codes armazenam texto. No modo alfanumérico, um QR code empacota dois desses 45 caracteres em 11 bits. Três caracteres Base45 custam, portanto, 16,5 bits para 16 bits de dados, cerca de 3% de acréscimo.

O Base64 não pode usar o modo alfanumérico, porque precisa de letras minúsculas. Ele tem que ir no modo byte, a 8 bits por caractere, o que dá 33% de acréscimo no QR code. Para os mesmos dados, o QR code em Base45 fica menor ou cabe mais.

Decodificando um Certificado Digital COVID da UE (HC1:)

O QR code do Certificado Digital COVID da UE contém uma string que começa com HC1:. O conteúdo é montado em camadas, e esta página cuida de uma delas:

  1. Remova o prefixo HC1:. H, C, 1 e : são todos caracteres Base45 válidos, então um prefixo deixado no lugar é decodificado como dados e estraga tudo o que vem depois.
  2. Decodifique o Base45 do restante aqui, com Para em Base64.
  3. Descompacte o resultado. São dados zlib, que começam com o byte 78 (eJ ou eN em Base64). Cole o Base64 no decodificador gzip e zlib.
  4. Faça o parse do CBOR. Os bytes descompactados são uma estrutura COSE_Sign1 em CBOR: um header, o payload com os campos do certificado e uma assinatura. Isso exige um decodificador CBOR, que este site não tem.

Decodificar mostra o conteúdo, mas não verifica a assinatura. Confirmar que um certificado é autêntico exige a chave pública do país emissor e um verificador COSE.

Base45 em Python

O Python não tem módulo Base45 na biblioteca padrão. O codificador segue a RFC diretamente:

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'

O pacote base45 do PyPI oferece os dois sentidos. Para mais sobre manipulação de bytes em Python, veja a página de Python.

Perguntas frequentes

Por que a saída Base45 contém espaços?

O espaço é um dos 45 caracteres do conjunto alfanumérico do QR, então ele é um dígito normal no Base45, com valor 36. Hello!! vira %69 VD92EX0. Mantenha os espaços ao copiar e não deixe um formulário ou shell cortá-los.

Dá para decodificar um Certificado Digital COVID da UE aqui?

Em parte. Esta página faz a etapa do Base45. Depois dela, os dados são CBOR compactado com zlib dentro de uma estrutura COSE assinada, o que exige uma etapa de descompressão e um decodificador CBOR; as etapas estão listadas nesta página.

Base45 é seguro para colocar numa URL?

Não. Espaço, %, + e / estão no alfabeto e todos têm significado em URLs. Aplique codificação percentual na string ou use Base64URL para URLs.

Por que minha string Base45 é rejeitada?

Um Base45 válido tem comprimento de 3n ou 3n + 2 caracteres, e cada grupo de 3 caracteres pode valer no máximo 65535. Um comprimento de 3n + 1, ou um grupo como GGW, é erro. Um prefixo HC1: esquecido é uma causa comum.