Enviar um arquivo
  1. base64hub
  2. Aprenda Base64
  3. Base64 vs outras codificações
Explicação

Base64 vs Hex, Base32, Base58 e Base85: comparação

Toda codificação de binário para texto troca tamanho por legibilidade e pelo conjunto de caracteres que pode usar. Aqui está a mesma entrada em nove delas, com o aumento de tamanho e o conjunto de caracteres de cada uma.

Tabela comparativa

Todas essas codificações transformam bytes arbitrários em texto imprimível e voltam sem perdas. Elas diferem em quantos caracteres usam, quais são eles e quanto a saída cresce.

CodificaçãoAlfabetoTamanho da saídaDiferencia maiúsculasSegura em URLUsos típicos
Hex (Base16)0-9 a-f200%NãoSimHashes, endereços MAC, dumps de bytes, códigos de cor
Base32 (RFC 4648)A-Z 2-7, preenchimento =160%Não (maiúsculas pela especificação)Sim, sem =Segredos TOTP, endereços onion do Tor, DNSSEC (base32hex)
Base58 (Bitcoin)1-9 A-Z a-z menos 0 O I lcerca de 137%SimSimEndereços Bitcoin, IPFS CIDv0 (Qm…), chaves Solana
Base64A-Z a-z 0-9 + /, preenchimento =133%SimNãoAnexos de e-mail, data URIs, PEM, payloads JSON
Base64URLA-Z a-z 0-9 - _133%SimSimJWT, tokens em URL, nomes de arquivo
Ascii85! a u, mais z125%SimNãoStreams de PDF e PostScript
Z8585 caracteres, incluindo .-:+=^!/*?&<>()[]{}@%$#125%SimNãoChaves CURVE do ZeroMQ
Base45 (RFC 9285)0-9 A-Z, espaço, $%*+-./:150%Não (só maiúsculas)NãoQR codes, Certificado Digital COVID da UE

“Tamanho da saída” é o comprimento codificado como proporção do comprimento da entrada, para entradas grandes. O Base64 precisa de 4 caracteres para cada 3 bytes, o Base32 de 8 para cada 5, o Base85 de 5 para cada 4 e o Base45 de 3 para cada 2. O Base58 não tem tamanho de bloco fixo, então sua razão é log(256) / log(58), cerca de 1,366. Para os números exatos de uma entrada específica, a calculadora de tamanho mostra todos de uma vez.

A mesma entrada em cada codificação

Aqui está a string ASCII de 12 bytes Hello world! codificada de nove jeitos. Doze bytes é múltiplo de 3 e de 4, então o Base64 e as variantes do Base85 não precisam de preenchimento.

CodificaçãoSaídaComprimento
Hex48656c6c6f20776f726c642124
Base32JBSWY3DPEB3W64TMMQQQ====24 (20 sem preenchimento)
Base32hex91IMOR3F41RMUSJCCGGG====24
Base58 (alfabeto do Bitcoin)2NEpo7TZRhna7vSvL17
Base64SGVsbG8gd29ybGQh16
Base45%69 VD82EK4F.KESTC18
Ascii8587cURD]j7BEbo8015
Z85nm=QNzY<mxA+]nf15
Base85 (RFC 1924 / git)NM&qnZy<MXa%^NF15

Aqui o Base64URL é idêntico ao Base64, porque a saída não contém + nem /. A diferença só aparece com certos bytes: fb ef be é ++++ em Base64 e ---- em Base64URL.

A biblioteca padrão do Python cobre a maior parte da tabela. O z85encode foi adicionado no Python 3.13:

import base64

data = b"Hello world!"
print(data.hex())                           # 48656c6c6f20776f726c6421
print(base64.b32encode(data).decode())      # JBSWY3DPEB3W64TMMQQQ====
print(base64.b64encode(data).decode())      # SGVsbG8gd29ybGQh
print(base64.a85encode(data).decode())      # 87cURD]j7BEbo80
print(base64.b85encode(data).decode())      # NM&qnZy<MXa%^NF
print(base64.z85encode(data).decode())      # nm=QNzY<mxA+]nf

O Base58 não está na biblioteca padrão, mas cabe em poucas linhas, porque é uma simples conversão de base de um único inteiro grande:

B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"

def b58encode(data: bytes) -> str:
    n = int.from_bytes(data, "big")
    out = ""
    while n:
        n, r = divmod(n, 58)
        out = B58[r] + out
    zeros = len(data) - len(data.lstrip(b"\0"))
    return "1" * zeros + out

print(b58encode(b"Hello world!"))   # 2NEpo7TZRhna7vSvL
print(b58encode(b"\0\0\x01"))       # 112

Cada byte zero no início vira um 1 literal, porque um inteiro grande não tem como guardar zeros à esquerda. É por isso que todo endereço Bitcoin legado com byte de versão zero começa com 1.

Onde cada codificação é usada

Hex

O hex gasta dois caracteres por byte, o que o torna a opção mais longa daqui e a mais fácil de ler. Cada caractere corresponde a exatamente 4 bits, então o byte no deslocamento n sempre fica nos caracteres 2n e 2n+1. Essa propriedade explica por que hashes, checksums e dumps de depuração quase sempre estão em hex. Os decodificadores aceitam tanto DEADBEEF quanto deadbeef. Converta com Base64 para hex e hex para Base64.

Base32

O Base32 usa só letras maiúsculas e os dígitos de 2 a 7. Ele sobrevive a sistemas que não diferenciam maiúsculas (nomes DNS, alguns sistemas de arquivos, pessoas digitando códigos no celular) e evita 0, 1 e 8, que se parecem com O, I e B. Os apps autenticadores guardam segredos TOTP em Base32, e os endereços onion v3 do Tor têm 56 caracteres Base32 em minúsculas. A RFC 4648 também define o base32hex (0-9 A-V), que preserva a ordem de classificação dos bytes originais. Experimente o codificador Base32.

Base58

O Base58 surgiu com o Bitcoin. Ele remove 0, O, I e l (fáceis de confundir) e + e / (que atrapalham a seleção com duplo clique e as URLs). Os endereços Bitcoin acrescentam um byte de versão e um checksum de 4 bytes, num formato chamado Base58Check. Os hashes IPFS CIDv0 também são Base58 e, como começam com os bytes de multihash 12 20, sempre começam com Qm. Como a entrada inteira é tratada como um único número, o tempo de conversão cresce quadraticamente com o comprimento, então o Base58 é usado para valores curtos, como chaves e hashes. Experimente o codificador Base58.

Ascii85, Z85 e o Base85 do git

A família Base85 empacota 4 bytes em 5 caracteres, a mais densa entre as codificações com amplo suporte. O problema é o alfabeto: 85 caracteres imprimíveis significam aspas, barras invertidas, <, > ou &, dependendo da variante.

  • Ascii85 (Adobe) usa de ! a u, envolve a saída em <~ e ~> e escreve quatro bytes zero como um único z. PostScript e PDF (o filtro ASCII85Decode) o utilizam.
  • Z85 (ZeroMQ) escolhe caracteres seguros dentro de literais de string em C e JSON, sem aspas nem barra invertida. Ele exige que o comprimento da entrada seja múltiplo de 4. Uma chave CURVE de 32 bytes tem 40 caracteres.
  • Base85 da RFC 1924 foi uma proposta de 1º de abril para endereços IPv6. O alfabeto dela sobrevive nos patches binários do git e no b85encode do Python.

A ferramenta Base85 cuida das três; o Z85 tem página própria.

Base45

O Base45 existe por causa dos QR codes. O modo alfanumérico de um QR code armazena exatamente 45 caracteres (dígitos, letras maiúsculas, espaço e $%*+-./:) a 5,5 bits cada, contra 8 bits por caractere no modo byte. O Base45 transforma 2 bytes em 3 desses caracteres, o que custa cerca de 3% dentro do QR code. Texto em Base64 precisa usar o modo byte e custa 33%. O Certificado Digital COVID da UE usou Base45 exatamente por isso. Experimente o codificador Base45.

Como escolher

Escolha a codificação que o lado receptor espera. Uma biblioteca JWT quer Base64URL, um app autenticador quer Base32, uma carteira Bitcoin quer Base58Check. Quando você controla as duas pontas, valem estas regras práticas:

  • Bytes dentro de JSON, XML, e-mail ou corpos HTTP: Base64. Toda linguagem tem uma implementação nativa rápida, e 33% de acréscimo é aceitável.
  • Dentro de uma URL, cookie ou nome de arquivo: Base64URL sem preenchimento.
  • Pessoas vão ler, digitar ou comparar o valor: hex para hashes curtos, Base32 quando a caixa das letras pode se perder, Base58 quando o valor deve parecer compacto e não ter caracteres parecidos.
  • Cada byte conta e você controla o decodificador: Z85 ou Ascii85.
  • QR codes: Base45.

A troca é sempre a mesma: um alfabeto maior dá uma saída mais curta e mais caracteres que precisam de escape em algum lugar. Para entender por que o Base64 cresce um terço, veja o acréscimo de tamanho do Base64. Para a variante URL-safe, veja Base64 vs Base64URL.

Perguntas frequentes

Qual codificação de binário para texto é a mais compacta?

Entre as comuns, o Base85 (Ascii85 e Z85), com 25% de acréscimo, seguido do Base64, com 33%. O basE91 consegue um pouco melhor, mas quase não tem suporte. Veja a ferramenta Base91 se precisar dele.

Por que o Bitcoin usa Base58 em vez de Base64?

O Base58 elimina 0, O, I, l, + e /, então os endereços ficam mais fáceis de ler em voz alta, copiar à mão e selecionar com duplo clique num campo de texto. O custo é uma conversão de número grande mais lenta, o que não importa para endereços de 25 bytes.

Maiúsculas e minúsculas fazem diferença no Base32 e no Base58?

O alfabeto da RFC 4648 é em maiúsculas, e decodificadores rígidos rejeitam minúsculas. Muitos aceitam as duas: no Python é preciso casefold=True. O Base58 diferencia maiúsculas: a e A são dígitos diferentes. Hex é indiferente a maiúsculas em praticamente todo decodificador.

Dá para converter Base64 em Base58 ou Base32 diretamente?

Sim, decodificando para bytes e codificando de novo. Os conversores Base64 para Base58 e Base64 para Base32 fazem as duas etapas localmente no seu navegador.

Continue lendo