Ascii85 エンコーダー・デコーダー

テキスト、16進数のバイト列、ファイルを、PostScript や PDF で使われる Base85 の一種である Ascii85 に変換し、元に戻します。Adobe の区切り記号を付けたり、長い出力を折り返したりできます。

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. テキストやバイト列を Ascii85 に変換するには「エンコード」を、Ascii85 をデータに戻すには「デコード」を選択します。
  2. 出力を PostScript で使う場合や、adobe=True を指定した Python の a85encode の出力と一致させる必要がある場合は、「区切り記号 <~ ~>」をオンにします。
  3. 長い出力を複数行に分けたい場合は、必要に応じて「折り返し」を設定します。
  4. データを入力または貼り付けるか、ファイルを開き、結果をコピーまたはダウンロードします。デコード時は、区切り記号、スペース、改行は無視されます。

Ascii85 とは

Ascii85 は入力を 4 バイトずつ読み取り、各グループを 32 ビットの数として扱い、85 進数の 5 桁で書き出します。数字には、!(コード 33)から u(コード 117)までの連続する 85 個の ASCII 文字を使います。各文字は、単に桁の値に 33 を足したものです。出力は入力より 25% 大きくなります(Base64 では 33%)。

この形式は、Unix の btoa ユーティリティで最初に使われました。その後 Adobe が PostScript Level 2 と PDF の ASCII base-85 エンコードとして採用し、画像やフォントなどのバイナリデータをプレーンテキストのファイルに収められるようにしました。Python では base64.a85encode()、Go では encoding/ascii85 パッケージとして提供されています。

z 表記と Adobe の区切り記号

4 つのゼロバイトからなるグループは、通常なら感嘆符 5 つで表されます。Ascii85 ではこれを 1 文字の z で表すため、空のデータが続いても短く済みます。この省略は完全なグループにのみ適用されます。入力の長さが 4 の倍数でない場合、n バイトの最後のグループは n + 1 文字になり、省略されることはありません。

PostScript では、Ascii85 文字列の先頭に <~、末尾に ~> を付けます。ASCII85Decode フィルターを使う PDF ストリームでは、データの終わりを示すマーカーとして末尾の ~> だけが使われます。このページのデコーダーは、どちらの区切り記号もあれば取り除き、空白文字を無視するため、PDF や PostScript ファイルのストリームデータをそのまま貼り付けられます。

コードで Ascii85 を扱う

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

仕様

使用文字ASCII 33(!)~117(u)と z
出力サイズ4 バイトごとに 5 文字(125%)
パディングなし(<~ ~> 区切り記号は任意)
規格Adobe PostScript・PDF
大文字と小文字の区別あり

エンコード例

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

よくある質問

Ascii85 と Base85 の違いは何ですか?
どちらも 4 バイトを 5 文字にエンコードしますが、アルファベットが異なります。Ascii85 は ! から u までの範囲を使い、z による省略表記があります。Base85 のページは Git や Python の b85encode と同じ RFC 1924 のアルファベットを使い、Z85 は ZeroMQ 版です。
出力に z という文字が含まれるのはなぜですか?
各 z は、完全なグループ内の 4 つのゼロバイトを表します。デコーダーが自動的に元に戻すため、データは変わりません。
Adobe の区切り記号は必要ですか?

データを読み込むプログラムが区切り記号を想定している場合にのみ必要です。たとえば、PostScript インタープリターや、adobe=True を指定した Python の a85decode です。多くのツールは区切り記号なしの Ascii85 も受け付けます。このページでデコードする場合、区切り記号は任意です。

PDF の ASCII85 ストリームをデコードできますか?

はい。ストリームデータを貼り付け、「出力形式」で「16進数」を選択するか、結果をダウンロードしてください。ストリームのフィルターで ASCII85Decode の後に FlateDecode が指定されている場合、デコードしたバイト列はまだ zlib で圧縮されているため、もう一段階の処理が必要です。

無効な文字のエラーが出るのはなぜですか?
Ascii85 で使えるのは、! から u までの文字と、グループの間に置く z だけです。一部の btoa のバージョンや、foldspaces=True を指定した Python で使われる、4 つのスペースを表す y の省略表記は Adobe の形式に含まれないため、エラーになります。