Ascii85-koder og -dekoder

Konverter tekst, hex-byte eller filer til Ascii85, Base85-varianten som brukes i PostScript og PDF, og tilbake. Legg til Adobe-avgrensere, eller bryt lange utdata over flere linjer.

Kjører helt i nettleseren din. Ingenting lastes opp.

Slik bruker du verktøyet

  1. Velg Kode for å gjøre tekst eller byte om til Ascii85, eller Dekode for å gjøre Ascii85 om til data igjen.
  2. Slå på Avgrensere <~ ~> hvis utdataene skal brukes i PostScript eller må samsvare med Python a85encode med adobe=True.
  3. Angi eventuelt Linjebryting, slik at lange utdata deles opp i linjer.
  4. Skriv, lim inn eller åpne en fil, og kopier eller last ned resultatet. Ved dekoding ignoreres avgrensere, mellomrom og linjeskift.

Hva er Ascii85?

Ascii85 leser inndataene 4 byte om gangen, behandler hver gruppe som et 32-biters tall og skriver det som 5 base-85-sifre. Sifrene er de 85 påfølgende ASCII-tegnene fra ! (kode 33) til u (kode 117): Hvert tegn er ganske enkelt sifferverdien pluss 33. Utdataene er 25 % større enn inndataene, mot 33 % for Base64.

Formatet ble først brukt av Unix-verktøyet btoa. Adobe tok det i bruk som ASCII base-85-kodingen i PostScript Level 2 og PDF, der det gjør det mulig å overføre binære data som bilder og skrifter inne i en ren tekstfil. Python tilbyr det som base64.a85encode() og Go som pakken encoding/ascii85.

Forkortelsen z og Adobe-avgrenserne

En gruppe på fire nullbyte ville normalt blitt skrevet som fem utropstegn. Ascii85 skriver den i stedet som én enkelt z, noe som holder serier av tomme data korte. Forkortelsen gjelder bare hele grupper. Når inndatalengden ikke er et multiplum av 4, blir den siste gruppen på n byte til n + 1 tegn og forkortes aldri.

PostScript markerer en Ascii85-streng med <~ i starten og ~> på slutten. I en PDF-strøm med filteret ASCII85Decode brukes bare den avsluttende ~>, som markør for slutten av dataene. Dekoderen her fjerner begge avgrenserne når de finnes, og ignorerer blanktegn, så du kan lime inn strømdata fra en PDF- eller PostScript-fil direkte.

Ascii85 i kode

# 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)

Spesifikasjon

AlfabetASCII 33 (!) til 117 (u), pluss z
Utdatastørrelse5 tegn per 4 byte (125 %)
UtfyllingIngen, valgfrie <~ ~>-avgrensere
StandardAdobe PostScript og PDF
Skiller store og små bokstaverJa

Eksempler

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

Ofte stilte spørsmål

Hva er forskjellen mellom Ascii85 og Base85?
Begge koder 4 byte som 5 tegn, men med ulike alfabeter. Ascii85 bruker området fra ! til u og har forkortelsen z. Siden Base85 bruker RFC 1924-alfabetet fra Git og Python b85encode, og Z85 er ZeroMQ-varianten.
Hvorfor inneholder utdataene mine bokstaven z?
Hver z står for fire nullbyte i en hel gruppe. Dekodere utvider den automatisk igjen, så dataene er uendret.
Trenger jeg Adobe-avgrenserne?

Bare hvis programmet som leser dataene, forventer dem, for eksempel en PostScript-tolk eller Python a85decode med adobe=True. Mange verktøy godtar Ascii85 uten dem. Ved dekoding her er avgrenserne valgfrie.

Kan jeg dekode en ASCII85-strøm fra en PDF?

Ja. Lim inn strømdataene og velg Hex som utdata, eller last ned resultatet. Hvis strømmen oppgir FlateDecode etter ASCII85Decode i filtrene sine, er de dekodede bytene fortsatt zlib-komprimerte og må gjennom et ekstra trinn.

Hvorfor får jeg en feil om ugyldig tegn?
Ascii85 tillater bare tegnene fra ! til u, pluss z mellom grupper. Forkortelsen y for fire mellomrom, som brukes av noen btoa-versjoner og av Python med foldspaces=True, er ikke en del av Adobe-formatet og blir avvist.