Como usar
- Escolha Codificar para transformar texto ou bytes em Ascii85, ou Decodificar para transformar Ascii85 de volta em dados.
- Ative a opção Delimitadores <~ ~> se a saída for para PostScript ou precisar coincidir com o a85encode do Python com adobe=True.
- Se quiser, defina uma Quebra de linha para dividir saídas longas em linhas.
- Digite, cole ou abra um arquivo e depois copie ou baixe o resultado. Ao decodificar, delimitadores, espaços e quebras de linha são ignorados.
O que é Ascii85?
O Ascii85 lê a entrada de 4 em 4 bytes, trata cada grupo como um número de 32 bits e o escreve como 5 dígitos na base 85. Os dígitos são os 85 caracteres ASCII consecutivos de ! (código 33) a u (código 117): cada caractere é simplesmente o valor do dígito mais 33. A saída é 25% maior que a entrada, contra 33% do Base64.
O formato foi usado pela primeira vez pelo utilitário Unix btoa. A Adobe o adotou como a codificação ASCII base-85 do PostScript Level 2 e do PDF, em que ele permite que dados binários, como imagens e fontes, viajem dentro de um arquivo de texto simples. O Python o oferece como base64.a85encode(), e o Go, como o pacote encoding/ascii85.
O atalho z e os delimitadores da Adobe
Um grupo de quatro bytes zero normalmente seria escrito como cinco pontos de exclamação. Em vez disso, o Ascii85 o escreve como um único z, o que mantém curtas as sequências de dados vazios. O atalho vale apenas para grupos completos. Quando o comprimento da entrada não é múltiplo de 4, o grupo final de n bytes vira n + 1 caracteres e nunca é abreviado.
O PostScript marca uma string Ascii85 com <~ no início e ~> no fim. Em um stream de PDF com o filtro ASCII85Decode, apenas o ~> de fechamento é usado, como marcador de fim de dados. O decodificador desta página remove qualquer um dos delimitadores quando presente e ignora espaços em branco, então você pode colar diretamente os dados de stream de um arquivo PDF ou PostScript.
Ascii85 no código
# Python 3.4+
import base64
base64.a85encode(b'hello') # b'BOu!rDZ'
base64.a85encode(b'hello', adobe=True) # b'<~BOu!rDZ~>'
base64.a85decode(b'<~BOu!rDZ~>', adobe=True) # b'hello'
// Go
import "encoding/ascii85"
dst := make([]byte, ascii85.MaxEncodedLen(len(src)))
n := ascii85.Encode(dst, src)
Especificação
| Alfabeto | ASCII 33 (!) a 117 (u), mais z |
|---|---|
| Tamanho da saída | 5 caracteres a cada 4 bytes (125%) |
| Preenchimento | Nenhum; delimitadores <~ ~> opcionais |
| Padrão | Adobe PostScript e PDF |
| Diferencia maiúsculas e minúsculas | Sim |
Exemplos
| Entrada (UTF-8) | Saída |
|---|---|
Hello, World! | 87cURD_*#4DfTZ)+T |
Base64.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
Perguntas frequentes
Qual é a diferença entre Ascii85 e Base85?
Por que minha saída contém a letra z?
z representa quatro bytes zero em um grupo completo. Os decodificadores o expandem de volta automaticamente, então os dados não mudam.Preciso dos delimitadores da Adobe?
Só se o programa que lê os dados esperar por eles, por exemplo um interpretador PostScript ou o a85decode do Python com adobe=True. Muitas ferramentas aceitam Ascii85 sem eles. Ao decodificar aqui, os delimitadores são opcionais.
Posso decodificar um stream ASCII85 de um PDF?
Sim. Cole os dados do stream e escolha a saída Hex ou baixe o resultado. Se o stream listar FlateDecode depois de ASCII85Decode nos filtros, os bytes decodificados ainda estarão compactados com zlib e precisarão de uma segunda etapa.
Por que recebo um erro de caractere inválido?
! a u, além de z entre grupos. A abreviação y para quatro espaços, usada por algumas versões do btoa e pelo Python com foldspaces=True, não faz parte do formato da Adobe e é rejeitada.