Como codificar e decodificar Ascii85
- Digite ou cole o texto em Entrada · Texto. O Ascii85 aparece em Saída · Ascii85 (Adobe).
- Abaixo da saída, marque Adicionar delimitadores <~ ~> para o enquadramento de PostScript/PDF, e desmarque z para grupos de zeros se o seu decodificador não suportar o atalho.
- Para usar outro alfabeto Base85, mude Para para Base85 (Git / Python b85), Z85 (ZeroMQ) ou RFC 1924 (IPv6 Base85).
- Para decodificar, clique em Ascii85 (Adobe) → Texto no seletor de direção. O decodificador aceita os delimitadores
<~ ~>,z,ye qualquer espaço em branco, então dados de arquivo com quebra de linha podem ser colados direto. - Para resultados binários, ajuste Para em Hex ou clique em Salvar bytes.
Como o Ascii85 funciona
O Ascii85 pega 4 bytes por vez, lê como um número de 32 bits big-endian e o escreve como 5 dígitos na base 85. Cada dígito é um caractere de ! (valor 0) a u (valor 84). Cinco caracteres para quatro bytes dão 25% de overhead, contra 33% do Base64.
O exemplo clássico é Man (com o espaço no final): os bytes 4d 61 6e 20 viram 9jqo^. Quando o último grupo está incompleto, o codificador o completa com bytes zero e escreve só n + 1 caracteres para n bytes, então Hello (5 bytes) vira 87cURDZ: cinco caracteres para Hell e dois para o.
Dois atalhos encurtam padrões comuns. O z substitui um grupo de quatro bytes zero, que por extenso seria !!!!!. O y substitui quatro espaços na variante btoa. Este decodificador lê os dois, e o codificador escreve z (pode ser desativado), mas nunca y.
Comparação das variantes de Base85
| Variante | Alfabeto | Hello | Onde é usada |
|---|---|---|---|
| Ascii85 (Adobe) | ! a u na ordem ASCII | 87cURDZ | PostScript, /ASCII85Decode do PDF |
| Base85 (Git / Python) | 0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~ | NM&qnZv | Patches binários do Git, base64.b85encode do Python |
| Z85 | 0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$# | nm=QNzV | Chaves do ZeroMQ e do CurveZMQ, veja Z85 |
| RFC 1924 | Igual ao do Git | 4)+k&C#VzJ4br>0wv%Yp para um endereço IPv6 | Endereços IPv6, como piada |
Os alfabetos do Git e da RFC 1924 são iguais, mas a RFC 1924 trata o endereço inteiro de 16 bytes como um único número de 128 bits, e não como quatro grupos de 4 bytes. A RFC 1924 foi publicada em 1º de abril de 1996 e propõe escrever 1080::8:800:200c:417a como 4)+k&C#VzJ4br>0wv%Yp. O conversor reproduz isso com De em Endereço IPv6 e Para em RFC 1924 (IPv6 Base85).
Ascii85 no PDF e no PostScript
O PostScript Level 2 introduziu o Ascii85 para embutir dados binários, como imagens e fontes, em um arquivo de texto. Os dados ficam entre <~ … ~>. No PDF, um stream com /Filter /ASCII85Decode guarda a mesma codificação, terminada por ~>. O decodificador daqui encontra o marcador final com ou sem o <~ de abertura.
O Ascii85 costuma ser o filtro externo de uma cadeia, por exemplo /Filter [/ASCII85Decode /FlateDecode]. Decodificar o Ascii85, nesse caso, dá bytes compactados com zlib, e não conteúdo legível.
O Git usa Base85 de outro jeito. Em um GIT binary patch, cada linha começa com um caractere de comprimento (A–Z para 1–26 bytes, a–z para 27–52), seguido do Base85 dos dados compactados com zlib. Remova esse primeiro caractere de cada linha antes de decodificar e depois descompacte o resultado.
Ascii85 e Base85 em Python
A biblioteca padrão tem os dois alfabetos:
import base64
base64.a85encode(b"Hello") # b'87cURDZ'
base64.a85encode(b"Hello", adobe=True) # b'<~87cURDZ~>'
base64.a85encode(b" ", foldspaces=True) # b'y'
base64.b85encode(b"Hello") # b'NM&qnZv'
base64.a85decode(b"<~9jqo^~>", adobe=True) # b'Man '
O a85decode precisa de adobe=True para aceitar os delimitadores. Veja a página de Python para mais receitas de codificação.
Problemas comuns
"z" na posição … só é permitido entre grupos de 5 caracteres. Há umzno meio de um grupo. Os dados estão danificados ou não são Ascii85; o Z85 e o Base85 do Git usamzcomo dígito comum.o grupo que começa na posição … está fora do intervalo. Cinco caracteres codificam um valor acima de 2^32 − 1. Isso acontece quando Base85 do Git ou Z85 é decodificado como Ascii85; troque o De.- Caractere inesperado como
v,{ou|. Tudo que vem depois deu, exceto os atalhosyez, está fora do alfabeto Ascii85, outro sinal de que a variante é diferente. - A saída tem bytes zero a mais no final. O seu codificador completou o último grupo e escreveu os 5 caracteres. O Ascii85 escreve n + 1 caracteres para um grupo final de n bytes.
Perguntas frequentes
Qual a diferença entre Base85 e Ascii85?
Base85 é a ideia geral de escrever 4 bytes como 5 caracteres de um conjunto de 85. Ascii85 é a versão da Adobe, com os caracteres de ! a u, o atalho z e os delimitadores <~ ~>. O Git, o b85encode do Python, o Z85 e a RFC 1924 usam a mesma aritmética com outros alfabetos.
O que significa z no Ascii85?
Um único z representa quatro bytes zero, que de outra forma seriam escritos !!!!!. Ele só é permitido onde começaria um grupo completo de 5 caracteres; um z no meio de um grupo é erro.
Como decodificar Ascii85 de um PDF?
Copie os dados do stream entre stream e endstream até o ~>, inclusive, e cole com a direção em Ascii85 (Adobe) → Texto. Se o stream também listar /FlateDecode, o resultado são dados zlib; ajuste Para em Base64 e descompacte com o decodificador gzip e zlib.
Base85 é melhor que Base64?
É cerca de 6% mais curto: 25% de overhead contra 33%. Mas, dependendo da variante, o alfabeto inclui aspas, barras invertidas ou < e &, então precisa de escape em JSON, XML ou shell, onde o Base64 não precisa. Use onde esses caracteres forem seguros.