末尾の=は元の文字ではなくパディングです。Base64は3バイトを4文字で表します。最後に1バイト残る場合は==、2バイトの場合は=でパディング付きの形式を完成させます。
文字数ではなくバイト数を数える
データ文字1つは6ビットを表し、3バイトは24ビットなので4文字に収まります。日本語や絵文字はUTF-8で複数バイトになることがあります。😀は4バイトで8J+YgA==になります。表では1・2・3バイトの入力を比較できます。
省略されたパディングの復元
省略が認められる形式では空白を除き、長さを4で割った余りを調べます。余り2なら==、3なら=を追加し、0なら追加不要です。余り1は不正または切れたデータを示し、=を足しても直せません。APIが求める形式を確認してください。
Zgは成功し、Zg=は失敗する理由
Decodexは完全に省略されたZgのパディングを復元し、fを返します。Zg==も有効です。Zg=は一部だけパディングがあり、全体の長さが不正なため拒否されます。A=AAやZg===も失敗します。コピーの誤りを隠すように=を繰り返し追加・削除しないでください。
この例を変換する
| テキスト | UTF-8 bytes | Base64 | パディング |
|---|---|---|---|
f | 1 | Zg== | == |
fo | 2 | Zm8= | = |
foo | 3 | Zm9v | — |
よくある質問
すべてのBase64は=で終わりますか?
いいえ。バイト数が3の倍数ならパディングは不要です。プロトコルによっては明示的に省略します。
