Codificador e decodificador Ascii85

Converta texto, bytes em hex ou arquivos em Ascii85, a variante do Base85 usada em PostScript e PDF, e vice-versa. Adicione os delimitadores da Adobe ou quebre saídas longas em linhas.

Funciona inteiramente no seu navegador. Nada é enviado.

Como usar

  1. Escolha Codificar para transformar texto ou bytes em Ascii85, ou Decodificar para transformar Ascii85 de volta em dados.
  2. Ative a opção Delimitadores <~ ~> se a saída for para PostScript ou precisar coincidir com o a85encode do Python com adobe=True.
  3. Se quiser, defina uma Quebra de linha para dividir saídas longas em linhas.
  4. 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

AlfabetoASCII 33 (!) a 117 (u), mais z
Tamanho da saída5 caracteres a cada 4 bytes (125%)
PreenchimentoNenhum; delimitadores <~ ~> opcionais
PadrãoAdobe PostScript e PDF
Diferencia maiúsculas e minúsculasSim

Exemplos

Entrada (UTF-8)Saída
Hello, World!87cURD_*#4DfTZ)+T
Base64.is6=FqH2Dd%#Er
你好jLq5JV7c

Perguntas frequentes

Qual é a diferença entre Ascii85 e Base85?
Os dois codificam 4 bytes como 5 caracteres, mas com alfabetos diferentes. O Ascii85 usa o intervalo de ! a u e tem o atalho z. A página Base85 usa o alfabeto da RFC 1924 do Git e do b85encode do Python, e o Z85 é a variante do ZeroMQ.
Por que minha saída contém a letra z?
Cada 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?
O Ascii85 só permite os caracteres de ! 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.