Base32は、 32進数に基づくバイナリからテキストへのエンコードです。32桁のアルファベットを使用し、各アルファベットは5ビットの異なる組み合わせ(2の5乗)を表します。Base32はあまり広く採用されていないため、 RFCや非公式および事実上の標準が存在するにもかかわらず、表記法、つまり32桁を表すためにどの文字を使用するかという問題は、よりよく知られている数値システム(16進数など)の場合ほど決まっていません。Base32の数値を人間が読める形式で表現する1つの方法は、0~9の数字に続いて22個の大文字A~Vを使用することです。ただし、さまざまなコンテキストで他の多くのバリエーションが使用されています。歴史的に、Baudotコードは修正された(ステートフルな)Base32コードと見なすことができます。Base32は、バイト文字列を表すためによく使用されます
2006年10月に提案されたインターネット標準[ 1 ] RFC 4648は、 base16 、base32、およびbase64エンコーディングを文書化しています。base32には2つのスキームが含まれていますが、どちらか一方を推奨しています。さらに、前例に関わらず、セクション6で定義するアルファベットのみを実際にbase32と呼び、セクション7にあるもう1つの同様のアルファベットはbase32hexと呼ぶことを推奨しています。[ a ]これらの推奨事項への同意は普遍的ではありません。base32と呼ばれるシステムを使用する場合は注意が必要です。これらのシステムは、RFC 4648 §6に従ってbase32、または§7に従って(RFCが後者のよりシンプルな名前を非推奨としていることを無視して)base32である可能性があり、あるいはそれらはさらに別のエンコーディングのバリエーションである可能性もあります。詳細は以下を参照してください
最も広く使用されているbase32アルファベットは、RFC 4648 §6およびそれ以前のRFC 3548 (2003)で定義されています。この方式は、2000年にJohn MyersによってSASL / GSSAPI用に最初に設計されました。[ 2 ] A~Zのアルファベットを使用し、その後に2~7が続きます。数字の0、1、8は、文字のO、I、Bと類似しているためスキップされます(したがって、「2」は10進数で26になります)。
状況によっては、パディングは不要、または使用されません(パディングは文字列の長さを8で割った剰余から推測できます)。RFC 4648では、標準仕様(RFCを参照)で明示的に別段の定めがない限り、パディングを使用しなければならないと規定されています。パディングを除外することは、URLトークンやファイル名でBase32エンコードされたデータを使用する際にパディング文字が問題となる可能性がある場合に有効です。
| 値 | 記号 | 値 | 記号 | 値 | 記号 | 値 | 記号 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | A | 8 | I | 16 | Q | 24 | Y | |||
| 1 | B | 9 | J | 17 | R | 25 | Z | |||
| 2 | C | 10 | K | 18 | S | 26 | 2 | |||
| 3 | D | 11 | L | 19 | T | 27 | 3 | |||
| 4 | 東 | 12 | M | 20 | 男性 | 28 | 4 | |||
| 5 | F | 13 | N | 21 | V | 29 | 5 | |||
| 6 | G | 14 | O | 22 | W | 30 | 6 | |||
| 7 | H | 15 | P | 23 | X | 31 | 7 | |||
| パディング | = | |||||||||
これは、前述の32文字セット(Base32大文字エンコードのIPFS CIDv1)を使用したBase32表現の例ですBAFYBEICZSSCDSBS7FFQZ55ASQDF3SMV6KLCW3GOFSZVWLYARCI47BGF354
「拡張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 ]
| 値 | 記号 | 値 | 記号 | 値 | 記号 | 値 | 記号 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 8 | 8 | 16 | G | 24 | ○ | |||
| 1 | 1 | 9 | 9 | 17 | H | 25 | P | |||
| 2 | 2 | 10 | A | 18 | I | 26 | Q | |||
| 3 | 3 | 11 | B | 19 | J | 27 | R | |||
| 4 | 4 | 12 | C | 20 | K | 28 | S | |||
| 5 | 5 | 13 | D | 21 | L | 29 | T | |||
| 6 | 6 | 14 | 東 | 22 | M | 30 | U | |||
| 7 | 7 | 15 | F | 23 | N | 31 | V | |||
| パディング | = | |||||||||
Base32 アルファベットを変更すると、すべての代替標準には同様の英数字記号の組み合わせが存在します。
z-base-32 [ 7 ]は、Zooko Wilcox-O'Hearnによって設計されたBase32エンコードで、人間にとって使いやすく、よりコンパクトです。1、8、9 を含みますが、l、v、0、2 は含まれません。また、アルファベットを並べ替えて、扱いやすい文字がより頻繁に出現するようにします。ビット長が8の倍数ではないビット文字列をコンパクトにエンコードし、末尾のパディング文字を省略します。z-base-32 はMnetオープンソースプロジェクトで使用され、現在はPhil ZimmermannのZRTPプロトコルとTahoe-LAFSオープンソースプロジェクト で使用されています
| 値 | 記号 | 値 | 記号 | 値 | 記号 | 値 | 記号 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | y | 8 | e | 16 | o | 24 | a | |||
| 1 | b | 9 | j | 17 | t | 25 | 3 | |||
| 2 | n | 10 | k | 18 | 1 | 26 | 4 | |||
| 3 | d | 11 | m | 19 | u | 27 | 5 | |||
| 4 | r | 12 | c | 20 | w | 28 | h | |||
| 5 | f | 13 | p | 21 | i | 29 | 7 | |||
| 6 | g | 14 | q | 22 | s | 30 | 6 | |||
| 7 | 8 | 15 | x | 23 | z | 31 | 9 |
Base32の別の代替設計は、ダグラス・クロックフォードによって作成されました。彼は、mod-37チェックサムに追加の文字を使用することを提案しました。[ 8 ]数字との混同を避けるため、I、L、Oの文字は除外されています。また、わいせつな意味になる可能性を減らすため、Uの文字も除外されています
バイナリ データを Crockford の Base32 でエンコードするライブラリは、さまざまな言語で利用できます。
| 値 | 数字をエンコード | 数字をデコード | 値 | 数字をエンコード | 数字をデコード | |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 o O | 16 | G | g G | |
| 1 | 1 | 1 i I l L | 17 | H | h H | |
| 2 | 2 | 2 | 18 | J | j J | |
| 3 | 3 | 3 | 19 | K | k K | |
| 4 | 4 | 4 | 20 | M | m M | |
| 5 | 5 | 5 | 21 | N | n N | |
| 6 | 6 | 6 | 22 | P | p P | |
| 7 | 7 | 7 | 23 | Q | q Q | |
| 8 | 8 | 8 | 24 | R | r R | |
| 9 | 9 | 9 | 25 | S | s S | |
| 10 | A | a A | 26 | T | t T | |
| 11 | B | b B | 27 | V | v V | |
| 12 | C | c C | 28 | W | w W | |
| 13 | D | d D | 29 | X | x X | |
| 14 | 東 | e E | 30 | Y | y Y | |
| 15 | F | f F | 31 | Z | z Z |
Electrologica X1のプログラマーは、マシンアドレスを表すために、32進表記の初期形式を使用していました。「数字」は0から31までの10進数で表されました。例えば、12-16はマシンアドレス400(= 12 × 32 + 16)を表します。
ジオハッシュアルゴリズムでは、修正されたbase32表現を使用して、緯度と経度の値を1つの(ビットインターレース)正の整数で表します。[ 9 ]この表現では、すべての10進数(0~9)と、文字「a」、「i」、「l」、「o」を除くほぼすべての小文字のアルファベットを使用します。次の文字マップに示されています
| 小数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 基数32 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | b | c | d | e | f | g | |||
| 小数 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
| 基数32 | h | j | k | m | n | p | q | r | s | t | u | v | w | x | y | z | |||
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)の数字のセットが生成されます
| 小数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 基数32 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | C | F | G | H | J | M | P | Q | |||
| 小数 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
| 基数32 | R | V | W | X | c | f | g | h | j | m | p | q | r | v | w | × | |||
Base32 にはBase64に比べて多くの利点があります。
Base32 には16 進数/ Base16に比べて次のような利点があります。
8 ビット ベースのエンコーディングと比較して、5 ビット システムは文字の伝送に使用する場合に次のような利点もあります。
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 ]