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ção | Alfabeto | Tamanho da saída | Diferencia maiúsculas | Segura em URL | Usos típicos |
|---|---|---|---|---|---|
| Hex (Base16) | 0-9 a-f | 200% | Não | Sim | Hashes, 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 l | cerca de 137% | Sim | Sim | Endereços Bitcoin, IPFS CIDv0 (Qm…), chaves Solana |
| Base64 | A-Z a-z 0-9 + /, preenchimento = | 133% | Sim | Não | Anexos de e-mail, data URIs, PEM, payloads JSON |
| Base64URL | A-Z a-z 0-9 - _ | 133% | Sim | Sim | JWT, tokens em URL, nomes de arquivo |
| Ascii85 | ! a u, mais z | 125% | Sim | Não | Streams de PDF e PostScript |
| Z85 | 85 caracteres, incluindo .-:+=^!/*?&<>()[]{}@%$# | 125% | Sim | Não | Chaves CURVE do ZeroMQ |
| Base45 (RFC 9285) | 0-9 A-Z, espaço, $%*+-./: | 150% | Não (só maiúsculas) | Não | QR 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ção | Saída | Comprimento |
|---|---|---|
| Hex | 48656c6c6f20776f726c6421 | 24 |
| Base32 | JBSWY3DPEB3W64TMMQQQ==== | 24 (20 sem preenchimento) |
| Base32hex | 91IMOR3F41RMUSJCCGGG==== | 24 |
| Base58 (alfabeto do Bitcoin) | 2NEpo7TZRhna7vSvL | 17 |
| Base64 | SGVsbG8gd29ybGQh | 16 |
| Base45 | %69 VD82EK4F.KESTC | 18 |
| Ascii85 | 87cURD]j7BEbo80 | 15 |
| Z85 | nm=QNzY<mxA+]nf | 15 |
| Base85 (RFC 1924 / git) | NM&qnZy<MXa%^NF | 15 |
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
!au, envolve a saída em<~e~>e escreve quatro bytes zero como um únicoz. PostScript e PDF (o filtroASCII85Decode) 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
b85encodedo 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.