バイナリデータの Base64 エンコーディング
Base64 がバイナリデータを ASCII テキストにエンコードする仕組みを理解。6ビットグループ化のプロセス、64文字のアルファベット、パディングルール、一般的な用途を解説。
詳細な説明
Base64 エンコーディングは、任意のバイナリデータを64種類の印刷可能な ASCII 文字を使ったテキスト文字列に変換します。多くの転送プロトコル(メール、JSON、URL)は生のバイナリバイトではなくテキストのみを確実に扱えるため、Base64 が存在します。
Base64 のアルファベット:
A-Z(0-25)、a-z(26-51)、0-9(52-61)、+(62)、/(63)、パディングには = を使用。
ビットレベルでの Base64 の動作:
- 入力の3バイト(合計24ビット)を取る
- 6ビットずつ4グループに分割
- 各6ビット値を Base64 アルファベットの文字に対応付け
ステップごとの例 --- "Hi" をエンコード:
- ASCII 値:
H=72,i=105 - 2進数:
01001000 01101001 - 6ビットの倍数にゼロパディング追加:
01001000 01101001 00000000 - 6ビットグループに分割:
010010000110100100000000 - Base64 インデックスに変換: 18, 6, 36, 0
- 文字を参照:
S,G,k,A - 入力が2バイト(3バイトではない)のため、パディング文字
=を1つ追加
結果: "SGk="
なぜ6ビットなのか?
64 = 2⁶ なので、6ビットで 0-63 の値を表現でき、64文字のアルファベットに完全に対応します。3バイトの入力(24ビット)は4つの6ビットグループに均等に分割されるため、Base64 は3バイト単位でデータを処理します。
33% のサイズ増加:
Base64 は入力の3バイトごとに4文字の出力に変換するため、33% のサイズ増加が発生します。これはバイナリデータをテキストとして表現するための避けられないコストです。
パディングルール:
- 3バイトの入力 -> 4つの Base64 文字(パディングなし)
- 2バイトの入力 -> 3つの Base64 文字 +
= - 1バイトの入力 -> 2つの Base64 文字 +
==
URL セーフ Base64: URL の特殊文字との衝突を避けるため、+ を - に、/ を _ に置き換えます。JWT、データ URI、URL パラメータで使用されます。
ユースケース
バックエンド開発者は、画像、証明書、暗号鍵などのバイナリアセットを JSON API レスポンス、設定ファイル、環境変数に埋め込むために Base64 エンコーディングを使用します。