Koder i dekoder Base85

Zamień tekst, bajty szesnastkowe lub pliki na Base85 i z powrotem. Ta strona używa zestawu znaków RFC 1924, czyli wariantu generowanego przez funkcję b85encode w Pythonie i stosowanego w binarnych łatkach Git.

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 Base85, lub „Dekoduj”, aby zamienić Base85 z powrotem na dane.
  2. Wpisz lub wklej dane wejściowe albo otwórz plik. Jeśli pracujesz na surowych bajtach, ustaw „Wejście jako” na „Hex”.
  3. Wynik aktualizuje się na bieżąco podczas pisania. Przy dekodowaniu ustaw „Wyjście jako” na „Tekst” lub „Hex” w zależności od zawartości danych.
  4. Skopiuj wynik lub pobierz go jako plik.

Czym jest Base85?

Base85 to rodzina kodowań, które zamieniają każde 4 bajty na 5 znaków. Pięć cyfr w systemie o podstawie 85 może przyjąć 85 × 85 × 85 × 85 × 85 = 4 437 053 125 wartości, czyli akurat tyle, by zmieścić dowolną liczbę 32-bitową. Dzięki temu wynik jest tylko o 25% większy od danych wejściowych, podczas gdy w Base64 jest to 33%.

Istnieje kilka alfabetów Base85 i nie są one wymienne: Ascii85 (Adobe, PDF), Z85 (ZeroMQ) oraz alfabet używany na tej stronie. Składa się on z 0-9, A-Z, a-z i 23 symboli: !#$%&()*+-;<=>?@^_`{|}~. Pominięto cudzysłów i apostrof, przecinek, kropkę, ukośnik, dwukropek, ukośnik wsteczny i nawiasy kwadratowe.

RFC 1924, Git i Python

Zestaw znaków pochodzi z RFC 1924 „A Compact Representation of IPv6 Addresses”, opublikowanego 1 kwietnia 1996 roku jako primaaprilisowy żart. Zaproponowano w nim zapis 128-bitowego adresu IPv6 jako jednej liczby w systemie o podstawie 85, mającej dokładnie 20 znaków. Nikt nie zapisuje tak adresów IPv6, ale alfabet wykorzystano później do zwykłych danych binarnych:

  • Git przechowuje pliki binarne w łatkach (git diff --binary, git format-patch) jako dane skompresowane zlib i zakodowane tym alfabetem, ze znakiem długości na początku każdego wiersza.
  • Python od wersji 3.4 udostępnia funkcje base64.b85encode() i b85decode(), których wynik jest zgodny z tym narzędziem.
  • Mercurial używa tego samego kodowania dla plików binarnych w różnicach w stylu Git.

Uwaga: RFC 1924 konwertuje cały 128-bitowy adres naraz, natomiast Git, Python i to narzędzie działają na grupach po 4 bajty, więc 16-bajtowa wartość daje inny wynik niż metoda z RFC.

Niepełne grupy końcowe

Gdy długość danych wejściowych nie jest wielokrotnością 4, ostatnia grupa jest uzupełniana bajtami zerowymi i kodowana, a z wyniku zachowuje się tylko pierwsze n + 1 znaków: 1 bajt daje 2 znaki, 2 bajty dają 3, a 3 bajty dają 4. Dekoder odwraca ten proces, więc znaki dopełnienia nie są potrzebne. W przeciwieństwie do z w Ascii85 ten wariant nie ma skrótu dla bajtów zerowych.

# Python 3.4+
import base64
base64.b85encode(b'hello')      # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv')    # b'hello'

Specyfikacja

Alfabet0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~
Rozmiar wyniku5 znaków na 4 bajty (125%)
DopełnienieBrak
StandardZestaw znaków RFC 1924 (Git, Python b85)
Rozróżnia wielkość literTak

Przykłady

Wejście (UTF-8)Wyjście
Hello, World!NM&qnZ!92JZ*pv8Ap
Base64.isLSb`dHZ(42a{
你好<h`KfrM&

Najczęściej zadawane pytania

Czy Base85 to to samo co Ascii85?
Oba używają tej samej arytmetyki, ale innych znaków, więc ich wyniki się różnią. Ascii85 dodatkowo skraca cztery bajty zerowe do z i może być ujęty w ograniczniki Adobe. Do danych PDF i PostScript użyj strony Ascii85.
Czy RFC 1924 był prawdziwym standardem?

Nie. To informacyjny dokument RFC opublikowany jako primaaprilisowy żart, który nigdy nie był używany do adresów IPv6. Jego zestaw znaków zyskał popularność później dzięki Git i Pythonowi.

O ile większy jest wynik Base85?
Każde 4 bajty dają 5 znaków, więc wynik jest 1,25 raza większy od danych wejściowych. W Base64 to ok. 1,33 raza. basE91 jest jeszcze nieco bardziej zwarty.
Czy Base85 można umieścić w JSON lub XML?
W JSON tak: alfabet nie zawiera cudzysłowu ani ukośnika wstecznego, więc niczego nie trzeba poprzedzać znakiem ucieczki. W XML i HTML znaki <, > i & trzeba zastąpić encjami. Base85 nie jest bezpieczny dla URL.