Jak używać
- Wybierz „Koduj”, aby zamienić tekst lub bajty na Ascii85, lub „Dekoduj”, aby zamienić Ascii85 z powrotem na dane.
- Włącz opcję „Ograniczniki <~ ~>”, jeśli wynik trafi do PostScript lub ma być zgodny z funkcją a85encode w Pythonie wywołaną z adobe=True.
- Opcjonalnie ustaw „Zawijanie wierszy”, aby podzielić długi wynik na wiersze.
- 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
| Alfabet | ASCII od 33 (!) do 117 (u) oraz z |
|---|---|
| Rozmiar wyniku | 5 znaków na 4 bajty (125%) |
| Dopełnienie | Brak, opcjonalne ograniczniki <~ ~> |
| Standard | Adobe PostScript i PDF |
| Rozróżnia wielkość liter | Tak |
Przykłady
| Wejście (UTF-8) | Wyjście |
|---|---|
Hello, World! | 87cURD_*#4DfTZ)+T |
Base64.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
Najczęściej zadawane pytania
Czym różni się Ascii85 od Base85?
Dlaczego wynik zawiera literę z?
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?
! 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.