Base32

Base32は、 32進数に基づくバイナリからテキストへのエンコードです。32のアルファベットを使用し、各アルファベットは5ビットの異なる組み合わせ(2の5乗)を表します。Base32はあまり広く採用されていないため、 RFCや非公式および事実上の標準が存在するにもかかわらず、表記法、つまり32桁を表すためにどの文字を使用するかという問題は、よりよく知られている数値システム(16進数など)の場合ほど決まっていません。Base32の数値を人間が読める形式で表現する1つの方法は、0~9の数字に続いて22個の大文字A~Vを使用することです。ただし、さまざまなコンテキストで他の多くのバリエーションが使用されています。歴史的に、Baudotコードは修正された(ステートフルな)Base32コードと見なすことができます。Base32は、バイト文字列を表すためによく使用されます

RFC 4648 エンコーディング

2006年10月に提案されたインターネット標準[ 1 ] RFC  4648は、 base16 、base32、およびbase64エンコーディングを文書化しています。base32には2つのスキームが含まれていますが、どちらか一方を推奨しています。さらに、前例に関わらず、セクション6で定義するアルファベットのみを実際にbase32と呼び、セクション7にあるもう1つの同様のアルファベットはbase32hexと呼ぶことを推奨しています。[ a ]これらの推奨事項への同意は普遍的ではありません。base32と呼ばれるシステムを使用する場合は注意が必要です。これらのシステムは、RFC 4648 §6に従ってbase32、または§7に従って(RFCが後者のよりシンプルな名前を非推奨としていることを無視して)base32である可能性があり、あるいはそれらはさらに別のエンコーディングのバリエーションである可能性もあります。詳細は以下を参照してください

§6に基づくBase 32エンコーディング

最も広く使用されているbase32アルファベットは、RFC 4648 §6およびそれ以前のRFC 3548 (2003)で定義されています。この方式は、2000年にJohn MyersによってSASL / GSSAPI用に最初に設計されました。[ 2 ] AZアルファベットを使用し、その後に27が続きます。数字の0、1、8文字のOIBと類似しているためスキップされます(したがって、「2」10進数で26になります)。  

状況によっては、パディングは不要、または使用されません(パディングは文字列の長さを8で割った剰余から推測できます)。RFC 4648では、標準仕様(RFCを参照)で明示的に別段の定めがない限り、パディングを使用しなければならないと規定されています。パディングを除外することは、URLトークンやファイル名でBase32エンコードされたデータを使用する際にパディング文字が問題となる可能性がある場合に有効です。

RFC 4648 Base32アルファベット
記号 記号 記号 記号
0A8I16Q24Y
1B9J17R25Z
2C10K18S262
3D11L19T273
412M20男性284
5F13N21V295
6G14O22W306
7H15P23X317
パディング

これは、前述の32文字セット(Base32大文字エンコードのIPFS CIDv1)を使用したBase32表現の例ですBAFYBEICZSSCDSBS7FFQZ55ASQDF3SMV6KLCW3GOFSZVWLYARCI47BGF354

§7に基づく拡張16進アルファベットによるBase 32エンコーディング

「拡張16進数」基数32またはbase32hex [ 3 ]は、 RFC 4648 §7に基づく基数32の別の方式であり、 16進数をより自然な方法で拡張します。その下半分は16進数と同じで、それを超えると、base32hexはアルファベットを文字Vまで継続します。

この方式は、 Sageソフトウェアのプログラマーであるクリスチャン・ランクトット氏によって、 1999年3月にDr. Dobb's誌への書簡の中で、Y2K問題に対する解決策の一部として初めて提案されました[ 4 ]。ランクトット氏はこれを「Double Hex」と呼んでいました。同じアルファベットは2000年にRFC 2938で「Base-32」という名前で記述されました。RFC 4648では、このバージョンがNSEC3で既に使用されていることを認めつつも、これをbase32hexと呼び、「base32」のみで呼ぶことを推奨していません。  

この表記法は0から9までの数字にアルファベットの連続文字を続けて用いるため、JavaScriptparseInt()関数[ 5 ]Pythonint()コンストラクタ[ 6 ]で10より大きい基数(16や32など)が指定された場合に使用される数字と一致します。また、RFC 4648の§6 base32(またはbase64)とは異なり、表現されるデータのビット単位のソート順序を保持するという16進数の特性も保持します。[ 3 ]

他の多くの32進表記法とは異なり、base32hexでは9を超える数字は連続しています。しかし、その数字セットには、視覚的に衝突する可能性のある文字が含まれています。多くのフォントでは、(0, O)と(1, I)のような似た文字を視覚的に区別できますが、他のフォントでは区別が難しい場合があり、base32の文字列のレンダリングには適さない場合があります。これは特に、英語が通常提供する文脈が存在しない、数字のみを表す表記法で顕著です。[ b ] フォントの選択は表記法やエンコードによって制御されませんが、base32hexは影響を受けるフォントの欠点を補うための試みは行っていません。[ c ]

「拡張16進数」32進アルファベット
記号 記号 記号 記号
008816G24
119917H25P
2210A18I26Q
3311B19J27R
4412C20K28S
5513D21L29T
661422M30U
7715F23N31V
パディング

代替エンコード方式

Base32 アルファベットを変更すると、すべての代替標準には同様の英数字記号の組み合わせが存在します。

z-base-32

z-base-32 [ 7 ]は、Zooko Wilcox-O'Hearnによって設計されたBase32エンコードで、人間にとって使いやすく、よりコンパクトです。1、8、9 を含みます、l、v、0、2 は含まれません。またアルファベット並べ替えて、扱いやすい文字より頻繁に出現するようにします。ビット長が8の倍数ではないビット文字列をコンパクトにエンコードし、末尾のパディング文字を省略します。z-base-32 はMnetオープンソースプロジェクトで使用され、現在はPhil ZimmermannZRTPプロトコルとTahoe-LAFSオープンソースプロジェクト で使用されています

Z基数32のアルファベット
記号 記号 記号 記号
0y8e16o24a
1b9j17t253
2n10k181264
3d11m19u275
4r12c20w28h
5f13p21i297
6g14q22s306
7815x23z319

クロックフォードのBase32

Base32の別の代替設計は、ダグラス・クロックフォードによって作成されました。彼は、mod-37チェックサムに追加の文字を使用することを提案しました。[ 8 ]数字との混同を避けるため、I、L、Oの文字は除外されています。また、わいせつな意味になる可能性を減らすため、Uの文字も除外されています

バイナリ データを Crockford の Base32 でエンコードするライブラリは、さまざまな言語で利用できます。

クロックフォードの32進数アルファベット
数字をエンコード 数字をデコード 数字をエンコード 数字をデコード
000 o O16Gg G
111 i I l L17Hh H
22218Jj J
33319Kk K
44420Mm M
55521Nn N
66622Pp P
77723Qq Q
88824Rr R
99925Ss S
10Aa A26Tt T
11Bb B27Vv V
12Cc C28Ww W
13Dd D29Xx X
14e E30Yy Y
15Ff F31Zz Z

エレクトロロジカ

Electrologica X1のプログラマーは、マシンアドレスを表すために、32進表記の初期形式を使用していました。「数字」は0から31までの10進数で表されました。例えば、12-16はマシンアドレス400(= 12 × 32 + 16)を表します。

ジオハッシュ

ジオハッシュアルゴリズムでは、修正されたbase32表現を使用して、緯度と経度の値を1つの(ビットインターレース)正の整数で表します。[ 9 ]この表現では、すべての10進数(0~9)と、文字「a」、「i」、「l」、「o」を除くほぼすべての小文字のアルファベットを使用します。次の文字マップに示されています

小数 0123456789101112131415
基数32 0123456789bcdefg
 
小数 16171819202122232425262728293031
基数32 hjkmnpqrstuvwxyz

チューリングの符号化

1950年頃、[ 10 ]アラン・チューリングはマンチェスター・マークIコンピューティングシステムのソフトウェア要件を作成しました。 [ 11 ]チューリングのマークIマニュアル の転写は archive.orgで入手できます。[ 12 ]

マンチェスター大学のコンピューティング60周年を記念したアーカイブサイト [ 13 ]には、チューリングが使用した32進数の符号化方式の表が掲載されています。この表と説明はマニュアルにも掲載されています。

チューリングの生涯におけるこの時期についての別の記述は、彼の伝記ページの「初期のコンピューターとチューリングテスト」に記載されています。

ビデオゲーム

NVRAMが普及する前、任天堂プラットフォーム向けのいくつかのビデオゲームは、パスワードに31進数の数字を使用していました。これらのシステムでは、ゲームが誤って不適切なパスワードを入力するのを防ぐため、母音(Yを除く)が省略されています。したがって、文字は一般的に以下のセットのわずかなバリエーションになります:0~9、B、C、D、F、G、H、J、K、L、M、N、P、Q、R、S、T、V、W、X、Y、Z、およびいくつかの句読点。このようなシステムを使用していることが知られているゲームには、 『マリオ・イズ・ミッシング!』『マリオのタイムマシン』『テトリスブラスト』『ロード・オブ・ザ・リング(スーパーファミコン)』など があります

単語安全なアルファベット

単語安全なBase32アルファベットは、Open Location CodeのBase20アルファベットの拡張版です。このアルファベットは、誤って単語を形成しないように、8桁の数字と大文字と小文字を区別する12桁の文字で構成されています。アルファベットを大文字と小文字を区別して扱うと、32桁(8+12+12)の数字のセットが生成されます

小数 0123456789101112131415
基数32 23456789CFGHJMPQ
 
小数 16171819202122232425262728293031
基数32 RVWXcfghjmpqrvw×

他のシステムとの比較

利点

Base32 にはBase64に比べて多くの利点があります。

  1. 結果として得られる文字セットはすべて大文字と小文字で構成され、大文字と小文字を区別しないファイルシステムDNS名、話し言葉、または人間の記憶を使用する場合に役立つことがよくあります。
  2. 結果は、 Unixパス区切り記号である '/' 記号を含めることができないため、ファイル名として使用できます。
  3. アルファベットを選択することで、似たような異なる記号の組み合わせを避けることができるため、文字列を手作業で正確に転記できます。(たとえば、RFC 4648 §6 の記号セットでは、1、8、0 の数字は省略されています。これは、これらの数字が文字「I」、「B」、「O」と混同される可能性があるためです。) 
  4. パディングを除外した結果は、文字をエンコードせずにURLに含めることができます。

Base32 には16 進数/ Base16に比べて次のような利点があります。

  1. Base32 表現では、必要なスペースが 20% 少なくなります。(1000 ビットでは 200 文字ですが、Base16 では 250 文字です。)

8 ビット ベースのエンコーディングと比較して、5 ビット システムは文字の伝送に使用する場合に次のような利点もあります。

  1. 完全なアルファベットを備えた RFC 4648 §6 Base32 スキームおよび類似のスキームでは、32 ビット整数ごとにさらに 2 つの文字をエンコードできるため (合計 4 文字ではなく 6 文字になり、2 ビットの余裕ができるため)、無線メッシュなどの制約のあるドメインで帯域幅を節約できます。

デメリット

Base32表現はBase64よりも約20%多くのスペースを必要とします。また、Base32は3つの8ビットバイト(24ビット)を4つの6ビットBase64文字にエンコードするのではなく、5つの8ビットバイト(40ビット)を8つの5ビットBase32文字にエンコードするため、8文字境界へのパディングは短いメッセージではより大きな負担となります(これが、RFC 4648でオプションとなっているパディングを省略する理由となる可能性があります)。  

バイナリデータの割合としての表記の長さ
Base64 Base32 16進数
8ビット133%160%200%
7ビット117%140%175%

Base32は16進数よりも約20%少ないスペースしか占有しませんが、Base32の使用量ははるかに少ないです。16進数2桁が1バイトなので、16進数はバイトに簡単にマッピングできます。Base32は個々のバイトにマッピングしません。しかし、Base32の2桁は10ビットに対応し、(32 × 32 =) 1,024の値をエンコードできます。これは、1,024の累乗で 表す複数バイト単位の桁数に明らかに適用できます

16 進数は、6 つの追加記号 (A ~ F) の数値を記憶するだけなので、学習や記憶が簡単です。また、これらの数値をすぐに思い出せなくても、いくつかの値を数える方が簡単です。

ソフトウェア実装

Base32プログラムは、人間が使いやすく、コンピュータでも処理できる制限された記号セットを使用して、任意のバイトデータをエンコードするのに適しています

Base32の実装では、少なくとも32種類の文字(場合によってはパディング用に33文字目)で構成されるシンボルセットと、任意の8ビットバイトシーケンスをBase32アルファベットにエンコードするアルゴリズムを使用します。各8ビット入力バイトを表すには複数の5ビットBase32文字が必要となるため、入力が5バイト(40ビット)の倍数でない場合、5ビットBase32文字に正確に収まりません。その場合、仕様によってはパディング文字の追加が求められる場合もあれば、5ビットの倍数にするためにゼロビットの追加が求められる場合もあります。これと密接に関連するBase64システムは、64個のシンボルセット(パディングを使用する場合は65個のシンボル)を使用します。

C/C++、[ 14 ] [ 15 ] Perl、[ 16 ] Java、[ 17 ] JavaScript [ 18 ] Python、[ 19 ] Go [ 20 ] Ruby [ 21 ]でのBase32実装が利用可能です。 [ 22 ]

参照

  • .onion  – 特殊用途トップレベルインターネットドメイン
  • Ascii85  – 85個の印字可能な文字を使用したバイト値のシーケンスのエンコード
  • Base16 – 16進数表現を使用したバイト値のシーケンスのエンコード
  • Base64  – 64個の印刷可能な文字を使用してバイト値のシーケンスをエンコードします
  • Base36  – 36個の印刷可能な文字を使用してバイト値のシーケンスをエンコードします
  • Base58  – バイナリデータをテキストとして表現するPages displaying short descriptions of redirect targets
  • Geohash  – 2008年に発明されたパブリックドメインのジオコーディング

注釈

  1. ^文脈上、提案された標準では2つのbase64エンコーディングも文書化されており、ここでも1つのエンコーディングが推奨されていますが、理由は異なります。文書化されているのは1つのbase16エンコーディングのみです。これは、RFC 4648またはその前身であるRFC 3548の発行以前から、長年にわたり広く採用されていました
  2. ^この類似性はかつてはバグではなく機能でした。初期のタイプライターでは、0と1の数字用の余分なキーを省略することができ、機械的な複雑さを軽減できたからです。コンピュータが導入されたとき、初期のコンピュータプリンターが高品質のタイプライターと同じ書体を印刷できることため、タイプライター風のフォントではこれらの文字の見た目が似ていました。本稿執筆の2025年現在、一部の文字を明確に区別できないフォントを使用する必要はなくなりましたが、伝統は残っています。また、同様の問題を抱えているのはタイプライター風のフォントだけではなく、 Helveticaなど多くの影響力のあるフォントで同様の問題が存在します。
  3. ^多くのbase32バリアントの設計は、識別可能なフォントが使用されることを想定するのは危険であるという考え方に基づいています。一方、その範囲外の奇妙な挙動を補正しようとしないスキームのロジックは、より単純かもしれません。

参考文献

  1. ^ 「公式インターネットプロトコル標準 » RFCエディター
  2. ^マイヤーズ、J. (2000 年 5 月 23 日)。SASL GSSAPI メカニズム。 IDdraft-ietf-cat-sasl-gssapi-01 2023年6月24日に取得
  3. ^ a b Josefsson, Simon (2006). 「7. 拡張16進アルファベットによるBase 32エンコーディング」 . RFC 4648: Base16、Base32、およびBase64データエンコーディング. IETF. doi : 10.17487/RFC4648 .
  4. ^ Lanctot, Christian (1999年3月1日). 「より良いデート?(この見出しの2番目の手紙) - 手紙」 . Dr Dobb's .
  5. ^ "parseInt() - JavaScript" . MDN Web ドキュメント。モジラ。 2023年12月29日。
  6. ^ 「組み込み関数」 . Pythonドキュメント. Python Software Foundation. 2018年10月26日時点のオリジナルよりアーカイブ2017年8月9日閲覧。
  7. ^ O'Whielacronx, Zooko (2009). 「人間指向のbase-32エンコーディング」 .
  8. ^ Douglas Crockford. 「Base 32」 . 2002年12月23日時点のオリジナルよりアーカイブ
  9. ^ “Tips & Tricks - geohash.org” . geohash.org . 2020年4月28日時点のオリジナルよりアーカイブ2020年4月3日閲覧。
  10. ^ 「アラン・M・チューリング(1912-1954)」 . Computer 50.マンチェスター大学. 2025年4月17日閲覧
  11. ^ 「アラン・M・チューリング(1912-1954)」 . Digital 60.マンチェスター大学. 2025年4月17日閲覧
  12. ^アラン・M・チューリング、ロバート・S・タウによる転写(2000年2月13日)。「アラン・チューリングのフェランティMk.Iマニュアル」(PDF)。Computer 50。マンチェスター大学。2011年6月7日時点のオリジナル(PDF)からアーカイブ。 2025年4月17日閲覧
  13. ^ 「Ferranti Mark 1でのプログラミング」 . Digital 60.マンチェスター大学. 2025年4月17日閲覧
  14. ^ 「CyoEncode」 . SourceForge . 2023年6月24日.
  15. ^ 「Gnulib - GNU ポータビリティライブラリ - GNU プロジェクト - フリーソフトウェア財団。www.gnu.org
  16. ^ 「MIME-Base32 - Base32エンコーダーとデコーダー」 MetaCPAN . 2018年7月29日閲覧
  17. ^ "Base32 (Apache Commons Codec 1.15 API)" . commons.apache.org .
  18. ^ "base32" . npm . 2022年9月27日.
  19. ^ 「base64 — Base16、Base32、Base64、Base85データエンコーディング」。Pythonドキュメント
  20. ^ 「Base32 パッケージ - encoding/Base32 - PKG.go.dev」
  21. ^ "base32 | RubyGems.org | コミュニティの gem ホスト" . ruby​​gems.org .
  22. ^ 「文字列から16進数へのコンバーター」コードを美しくする