Koder i dekoder Ascii85

Zamień tekst, bajty szesnastkowe lub pliki na Ascii85, czyli wariant Base85 stosowany w PostScript i PDF, i z powrotem. Dodaj ograniczniki Adobe lub podziel długi wynik na wiersze.

Działa w całości w przeglądarce. Nic nie jest wysyłane.

Jak używać

  1. Wybierz „Koduj”, aby zamienić tekst lub bajty na Ascii85, lub „Dekoduj”, aby zamienić Ascii85 z powrotem na dane.
  2. Włącz opcję „Ograniczniki <~ ~>”, jeśli wynik trafi do PostScript lub ma być zgodny z funkcją a85encode w Pythonie wywołaną z adobe=True.
  3. Opcjonalnie ustaw „Zawijanie wierszy”, aby podzielić długi wynik na wiersze.
  4. Wpisz lub wklej dane albo otwórz plik, a następnie skopiuj lub pobierz wynik. Przy dekodowaniu ograniczniki, spacje i znaki końca wiersza są ignorowane.

Czym jest Ascii85?

Ascii85 odczytuje dane wejściowe po 4 bajty, traktuje każdą grupę jako liczbę 32-bitową i zapisuje ją jako 5 cyfr w systemie o podstawie 85. Cyframi jest 85 kolejnych znaków ASCII od ! (kod 33) do u (kod 117): każdy znak to po prostu wartość cyfry plus 33. Wynik jest o 25% większy od danych wejściowych, wobec 33% w przypadku Base64.

Format ten jako pierwsze zastosowało uniksowe narzędzie btoa. Adobe przyjęło go jako kodowanie ASCII base-85 w PostScript Level 2 i PDF, gdzie pozwala przenosić dane binarne, takie jak obrazy i czcionki, wewnątrz zwykłego pliku tekstowego. Python udostępnia je jako base64.a85encode(), a Go jako pakiet encoding/ascii85.

Skrót z i ograniczniki Adobe

Grupa czterech bajtów zerowych normalnie zostałaby zapisana jako pięć wykrzykników. Ascii85 zapisuje ją zamiast tego jako pojedyncze z, dzięki czemu ciągi pustych danych pozostają krótkie. Skrót dotyczy tylko pełnych grup. Gdy długość danych wejściowych nie jest wielokrotnością 4, końcowa grupa n bajtów daje n + 1 znaków i nigdy nie jest skracana.

PostScript oznacza ciąg Ascii85 sekwencją <~ na początku i ~> na końcu. W strumieniu PDF z filtrem ASCII85Decode używa się tylko zamykającego ~> jako znacznika końca danych. Ten dekoder usuwa oba ograniczniki, jeśli występują, i ignoruje białe znaki, więc dane strumienia z pliku PDF lub PostScript można wkleić bezpośrednio.

Ascii85 w kodzie

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

Specyfikacja

AlfabetASCII od 33 (!) do 117 (u) oraz z
Rozmiar wyniku5 znaków na 4 bajty (125%)
DopełnienieBrak, opcjonalne ograniczniki <~ ~>
StandardAdobe PostScript i PDF
Rozróżnia wielkość literTak

Przykłady

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

Najczęściej zadawane pytania

Czym różni się Ascii85 od Base85?
Oba kodują 4 bajty jako 5 znaków, ale z różnymi alfabetami. Ascii85 używa zakresu od ! do u i ma skrót z. Strona Base85 używa alfabetu RFC 1924 znanego z Git i funkcji b85encode w Pythonie, a Z85 to wariant ZeroMQ.
Dlaczego wynik zawiera literę z?
Każde z oznacza cztery bajty zerowe w pełnej grupie. Dekodery automatycznie je rozwijają, więc dane pozostają niezmienione.
Czy ograniczniki Adobe są potrzebne?

Tylko wtedy, gdy oczekuje ich program odczytujący dane, np. interpreter PostScript lub funkcja a85decode w Pythonie z adobe=True. Wiele narzędzi akceptuje Ascii85 bez nich. Przy dekodowaniu na tej stronie ograniczniki są opcjonalne.

Czy można zdekodować strumień ASCII85 z pliku PDF?

Tak. Wklej dane strumienia i ustaw „Wyjście jako” na „Hex” lub pobierz wynik. Jeśli w filtrach strumienia po ASCII85Decode występuje FlateDecode, zdekodowane bajty są nadal skompresowane zlib i wymagają drugiego kroku.

Skąd się bierze błąd nieprawidłowego znaku?
Ascii85 dopuszcza tylko znaki od ! do u oraz z między grupami. Skrót y oznaczający cztery spacje, używany przez niektóre wersje btoa i przez Pythona z foldspaces=True, nie należy do formatu Adobe i jest odrzucany.