Base64 の実践ガイド: ビット、パディング、検証

6 ビット グループ全体でバイトを追跡し、出力サイズを計算し、正規の Base64 と回復可能なフォーマットの問題を区別します。

Base64 は、制限されたテキスト アルファベットを使用したバイトの表現です。これは、トランスポートがテキストを受け入れるが、ペイロードがバイナリである場合に便利です。この操作は元に戻すことができます。正しいデコーダは、有効な文字ではないゼロや値を含む元のバイトを復元します。これらのバイトを解釈する方法の選択は別のステップです。

3バイトが4文字になる

1 バイトは 8 ビットです。3 バイトは 24 ビットなので、6 ビットずつ 4 組に分けられます。各組は、64 文字からなる文字集合のうち 1 文字に対応します。標準の文字集合には、英大文字、英小文字、数字、プラス(+)、スラッシュ(/)が含まれます。ASCII テキスト Manのバイト列を 16 進数で表すと 4d 61 6e となり、エンコード結果は次のとおりです: TWFu。

Input bytes:  01001101 01100001 01101110
Six-bit sets: 010011 010110 000101 101110
Indexes:      19     22     5      46
Output:       T      W      F      u

パディングは最終グループを説明します

1 バイトが残ると、出力には 2 つのアルファベット文字と 2 つの等号が含まれます。残りの 2 バイトは、3 つのアルファベット文字と 1 つの等号を生成します。したがって、 M は次の値に変換されます: TQ==、一方 Ma は次の値に変換されます: TWE=。パディングは構造的なものです。ランダムな等号を追加しても、欠落しているペイロード文字を回復することはできません。正規のエンコーディングでは、最後のアルファベット文字の未使用ビットもゼロにする必要があります。

入力が n バイトの場合、パディングを含む出力は 4 × ceil(n / 3) 文字になります。したがって、1,024 バイトのファイルは、Data URI の接頭辞や改行を追加する前の段階で 1,368 文字になります。Base64 は圧縮ではありませんが、通信時に別の圧縮処理を行えば、最終的な転送量が小さくなる場合があります。

解釈する前に検証する

定義されたプロトコルに対してプロデューサーをテストする場合は、厳密モードを使用します。既知のソースで ASCII 改行が挿入されている場合、パディングが省略されている場合、または Data URI ラッパーが含まれている場合は、互換モードを使用します。記録された調整を確認します。予期しない句読点、混合アルファベット、およびゼロ以外の未使用ビットは、サイレント削除ではなく、調査に値します。

最後に、デコードされたバイトを検査します。有効な Base64 には、無効な UTF-8 シーケンス、切り詰められたイメージ、または不完全な PDF が含まれる可能性があります。デコードが成功すると、エンコード層のみが証明されます。バイナリ結果をバイトとして保存し、適切なファイル パーサーを使用してその構造を確認します。アルファベット、パディング、および正規ビットのルールは、次のように指定されます。 RFC 4648。