Base64エンコードのオーバーヘッド
入力
| バイナリサイズ | 1 MB |
|---|
Base64エンコードのオーバーヘッド
バイナリデータのサイズを入力して、Base64エンコード後の出力サイズとオーバーヘッドを求めます。
入力
バイナリ入力
結果
値を入力すると計算結果が表示されます。
エンコード後の出力
サイズの内訳
Base64エンコードのオーバーヘッド
Base64は、任意のバイナリデータを64種類の印刷可能なASCII文字で表現するバイナリ・テキスト変換方式です。メール添付ファイル、HTMLのデータURI、PEM証明書、JSON APIペイロードなど、テキスト専用のチャネルにバイナリコンテンツを埋め込む際の標準的な手段として広く使われています。エンコードは可逆かつ無損失ですが、データサイズがおよそ3分の1増加します。
Base64エンコードの仕組み
Base64はバイナリ入力を3バイト(24ビット)単位で読み込み、各グループを6ビットずつ担う4文字にマッピングします。
64種類の文字はそれぞれ0から63の値を表し、A–Z、a–z、0–9、+、/ から選ばれています。出力には制御文字、ヌルバイト、127を超えるバイトが含まれないため、ASCIIと互換性のある任意のトランスポートで安全に使用できます。
サイズ計算式
入力3バイトが出力4バイトになるため、エンコード後のサイズは次の式で求められます。
天井関数(切り上げ)は、入力長が3の倍数でない場合に最後のグループに1つまたは2つの = 文字をパディングする処理に対応しています。
元のサイズに対するオーバーヘッドの割合は次のとおりです。
入力が3バイトの厳密な倍数である場合、これはちょうど となります。
計算例
1 MB のバイナリファイル(1,000,000 バイト)の場合:
実用上の注意点
メールと MIME。 添付ファイルはメッセージ本文の中でBase64エンコードされます。3 MB の PDF をメールに添付すると、メールサイズがおよそ4 MB に膨らむのはこのためです。
データ URI。 200 KB の PNG 画像をデータ URI として HTML や CSS に埋め込むと、テキストとしておよそ 267 KB になり、ページの容量が増加します。小さなアイコンであれば追加の HTTP リクエストを避けられる利点がありますが、大きな画像ではサイズ面での損失が上回ることが多くなります。
JSON API。 JSON にはネイティブのバイナリ型がないため、画像・音声・暗号署名などのバイナリデータはJSON 文字列に格納する前にBase64エンコードされることが多くあります。ペイロードサイズを設計する際には、エンコードによるオーバーヘッドを考慮する必要があります。
URL セーフ Base64。 + を - に、/ を _ に置き換えることで、パーセントエンコードなしにURLのパスやクエリパラメータで安全に使用できる出力を生成するシステムもあります。サイズの計算式は標準の Base64 と同じです。
圧縮率の計算 を使うと、エンコード前に圧縮することでオーバーヘッドを部分的に相殺できるかを評価できます。圧縮後のデータは1バイトあたりのエンコード効率が高くなることが多いです。
基数変換ツール は、Base64 が最終的にエンコードする16進数やバイナリ表現を扱う際に役立ちます。
よくある質問 (FAQ)
なぜBase64のオーバーヘッドは約33%になるのですか?
Base64はバイナリデータの3バイトを、印刷可能なASCII文字4文字としてエンコードします。3バイトには24ビットの情報が含まれており、4つのBase64文字も同じく24ビット(各6ビット)を保持しますが、テキスト形式では各文字が1バイトを占めます。
その結果、3バイトが4バイトになり、ちょうど3分の1(約33.3%)の増加となります。入力長が3の倍数でない場合は、最後の4文字グループを完成させるためにパディング文字(=)が追加され、オーバーヘッドが33%をわずかに超えることがあります。
Base64エンコードはどのような場面で使われますか?
Base64はバイナリデータを印刷可能なASCIIの安全なサブセットに変換し、テキスト専用のチャネルを通じてデータが壊れることなく送受信できるようにします。主な用途としては、HTMLやCSSへの画像・フォントの直接埋め込み(データURI)、メールのバイナリ添付ファイル(MIME)、暗号鍵や証明書のエンコード(PEM形式)、JSON APIでのバイナリデータの送受信などがあります。33%のオーバーヘッドは、テキスト安全な転送を保証するためのコストとして受け入れられています。
Base64と16進数エンコードの違いは何ですか?
16進数(base 16)は各バイトを2桁の16進数文字で表すため、データサイズが常に2倍になります(オーバーヘッド100%)。Base64は64種類の文字を使用し、1文字あたり4ビットではなく6ビットを格納できるため、同じデータを2倍ではなく4/3倍の文字数でエンコードできます。
出力サイズが重要な場合はBase64が標準的な選択です。一方、1バイトが2桁の16進数に直接対応するため、人が読みやすく、デバッグに適している場合は16進数が好まれます。
Base64出力末尾の「=」パディングとは何ですか?
Base64は入力を3バイト単位で処理します。最後のグループが1バイトのみの場合は「==」が付加され、2バイトの場合は「=」が1つ付加されます。これにより出力長が常に4文字の倍数となり、デコード処理が簡略化されます。パディング自体には情報内容はなく、URLセーフBase64のように省略するシステムもあり、デコード時に出力長からパディングを再構築します。