Base85エンコーダー・デコーダー

Base85は4バイトを5つのASCII文字に詰め込みます。64文字ではなく85文字の文字集合を使うため、Base64の「3バイトを4文字」という比率より高密度です。AdobeのAscii85形式はすべてのPostScriptファイルとPDFファイルの中で使われています。より新しいZ85(ZeroMQ)形式は、C言語の文字列やXMLの中で問題を起こす文字を避けています。このツールは、区切り記号を付けるかどうかを選べる形で、両形式のエンコードとデコードに対応します。

Base85を変換する方法

  1. 1

    形式を選ぶ

    PDFやPostScriptの素材にはAscii85、ソースコードやネットワークプロトコルにはZ85を選びます。

  2. 2

    テキストを貼り付けるかファイルをアップロード

    エンコードでは生のバイト列を、デコードではBase85の文字列を受け取ります。

  3. 3

    エンコーダーが4バイトごとに分割

    4バイトの各ブロックが5文字のBase85文字列になります。最後のブロックは詰め物を加えてから末尾を切り詰めます。

  4. 4

    結果をコピー

    Ascii85は必要に応じて`<~`と`~>`の区切り記号で囲めます。Z85では区切り記号は使いません。

サイズ増加率の比較

符号化方式 4バイトあたりの文字数 バイナリと比べた増加率
Hex 8 +100%
Base64 5.33(詰め物込みで8に切り上げ) +37%
Base85 5 +25%
生バイナリ 4 0

つまり1 MBのバイナリは、Base85では1.25 MB、Base64では1.33 MB、hexでは2 MBになります。

Ascii85とZ85の文字集合

Ascii85(RFC 1924 / Adobe): ASCIIの!からuまで(33〜117)の文字に加え、4つのゼロバイトを表す短縮記号としてzを使います。PostScriptとPDFのストリームで使われ、<~...~>で囲まれます。

Z85(ZeroMQ): 引用符やエスケープが必要な文字を避けた部分集合です。

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#

JSON、XML、C言語の文字列、ソースコードの中に、エスケープせずにそのまま埋め込めます。

計算の仕組み

4バイトごとに、ビッグエンディアンの32ビット整数Nとして読み取ります。出力される5文字は、Nを85進数で表したときの各桁で、上位の桁から並びます。85^5 = 4 437 053 1252^32より大きいため、4バイトは必ず5文字に収まります。

Ascii85が役立つ場面

PDFをテキストエディターで開き、ASCII85Decodeを検索してみてください。Adobeは、7ビット伝送(古いファクス風のシステム)を通り抜ける必要がある埋め込み画像やフォントのフィルターとして、これを使っています。Z85はZeroMQのCURVE認証鍵で広く使われています。

特殊なケース

  • すべてゼロの4バイトブロック - Ascii85では!!!!!ではなく1文字のzにエンコードします。
  • すべて空白の4バイトブロック - 一部の形式は4つの空白にyを使いますが、使わないものもあります。
  • 末尾の半端なブロック - ゼロバイトで埋めてから、対応する数の出力文字を末尾で切り詰めます。

よくある質問

出力が小さいという意味では、はい。どこでも使えるという意味では、いいえ。Base85には<>&"(Ascii85の場合)のように、XML、JSON、URLでエスケープが必要な文字が含まれます。Z85はこれを避けますが、ほとんどのツールは標準でBase64に対応しています。

PostScriptやPDFのファイルを扱うならAscii85です。ソースコード、設定ファイル、ネットワークプロトコルにはZ85を使います。RFC 1924のIPv6符号化は同じ85文字を別の割り当てで使うもので、実際にはほとんど使われません。

いいえ。両者は異なる文字集合を使います。Ascii85をZ85の対応表でデコードすると、意味のないデータになります。エンコードする前にどちらか一方を選び、それを使い続けてください。

PDFやPostScriptのストリーム内のAdobe Ascii85では必要です。エンコードされた範囲を示すためです。単独で使う場合や、すべてのZ85出力では、区切り記号は不要です。

関連ツール