使い方
- テキストやバイト列を Base85 に変換するには「エンコード」を、Base85 をデータに戻すには「デコード」を選択します。
- データを入力または貼り付けるか、ファイルを開きます。生のバイト列を扱う場合は、「入力形式」を「16進数」に切り替えます。
- 結果は入力に合わせてリアルタイムに更新されます。デコード時は、データの内容に応じて「出力形式」で「テキスト」または「16進数」を選択します。
- 結果をコピーするか、ファイルとしてダウンロードします。
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.is | LSb`dHZ(42a{ |
你好 | <h`KfrM& |
よくある質問
Base85 と Ascii85 は同じものですか?
z と略記し、Adobe の区切り記号で囲まれることもあります。PDF や PostScript のデータには Ascii85 のページを使ってください。RFC 1924 は正式な規格だったのですか?
いいえ。エイプリルフールのジョークとして公開された情報提供(Informational)の RFC で、IPv6 アドレスに使われたことはありません。その文字セットが、後に Git や Python を通じて広まりました。
Base85 の出力はどのくらい大きくなりますか?
Base85 を JSON や XML に入れられますか?
<、>、& をエスケープする必要があります。Base85 は URL セーフではありません。