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

テキスト、16進数のバイト列、ファイルを Base85 に変換し、元に戻します。このページでは、Python の b85encode が出力し、Git のバイナリパッチでも使われている RFC 1924 の文字セットを採用しています。

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

使い方

  1. テキストやバイト列を Base85 に変換するには「エンコード」を、Base85 をデータに戻すには「デコード」を選択します。
  2. データを入力または貼り付けるか、ファイルを開きます。生のバイト列を扱う場合は、「入力形式」を「16進数」に切り替えます。
  3. 結果は入力に合わせてリアルタイムに更新されます。デコード時は、データの内容に応じて「出力形式」で「テキスト」または「16進数」を選択します。
  4. 結果をコピーするか、ファイルとしてダウンロードします。

Base85 とは

Base85 は、4 バイトごとに 5 文字に変換するエンコード方式の総称です。85 進数の 5 桁で 85 × 85 × 85 × 85 × 85 = 4,437,053,125 通りの値を表せ、これは任意の 32 ビット数をちょうど収められる大きさです。そのため、Base64 では出力が 33% 大きくなるのに対し、Base85 では 25% の増加で済みます。

Base85 のアルファベットは複数あり、互換性はありません。Ascii85(Adobe、PDF)、Z85(ZeroMQ)、そしてこのページのものです。このページのアルファベットは、0-9、A-Z、a-z と 23 個の記号 !#$%&()*+-;<=>?@^_`{|}~ を使います。引用符、カンマ、ピリオド、スラッシュ、コロン、バックスラッシュ、角かっこは含まれません。

RFC 1924、Git、Python

この文字セットは、1996 年 4 月 1 日にエイプリルフールのジョークとして公開された RFC 1924「A Compact Representation of IPv6 Addresses」(IPv6 アドレスのコンパクトな表現)に由来します。この RFC は、128 ビットの IPv6 アドレスを、ちょうど 20 文字の 85 進数 1 つで表記することを提案しました。IPv6 アドレスを実際にそう書く人はいませんが、このアルファベットは後に一般的なバイナリデータ向けに再利用されました。

  • Git は、パッチ内のバイナリファイル(git diff --binary、git format-patch)を zlib で圧縮したうえでこのアルファベットでエンコードし、各行の先頭に長さを示す文字を付けて格納します。
  • Python 3.4 以降には base64.b85encode() と b85decode() があり、その出力はこのツールと一致します。
  • Mercurial も、Git 形式の差分に含まれるバイナリファイルに同じエンコードを使います。

なお、RFC 1924 は 128 ビットのアドレス全体を一度に変換しますが、Git、Python、このツールは 4 バイト単位で処理します。そのため、16 バイトの値では RFC の方式とは異なる結果になります。

端数のある最後のグループ

入力の長さが 4 の倍数でない場合は、最後のグループをゼロバイトで埋めてエンコードし、先頭の n + 1 文字だけを残します。1 バイトは 2 文字、2 バイトは 3 文字、3 バイトは 4 文字になります。デコーダーはこの処理を逆にたどるため、パディング文字は必要ありません。Ascii85 の z とは異なり、この方式にはゼロバイトを省略する表記はありません。

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

仕様

使用文字0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~
出力サイズ4 バイトごとに 5 文字(125%)
パディングなし
規格RFC 1924 の文字セット(Git、Python b85)
大文字と小文字の区別あり

エンコード例

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

よくある質問

Base85 と Ascii85 は同じものですか?
計算方法は同じですが文字が異なるため、出力も異なります。また、Ascii85 は 4 つのゼロバイトを z と略記し、Adobe の区切り記号で囲まれることもあります。PDF や PostScript のデータには Ascii85 のページを使ってください。
RFC 1924 は正式な規格だったのですか?

いいえ。エイプリルフールのジョークとして公開された情報提供(Informational)の RFC で、IPv6 アドレスに使われたことはありません。その文字セットが、後に Git や Python を通じて広まりました。

Base85 の出力はどのくらい大きくなりますか?
4 バイトごとに 5 文字になるため、出力は入力の 1.25 倍です。Base64 は約 1.33 倍です。basE91 はさらに少しコンパクトです。
Base85 を JSON や XML に入れられますか?
JSON なら問題ありません。アルファベットにダブルクォートやバックスラッシュが含まれないため、エスケープは不要です。XML や HTML では <、>、& をエスケープする必要があります。Base85 は URL セーフではありません。