なぜBase64はファイルサイズを33%増加させるのか?(エンコーディングの仕組み)
Web開発において、画像やファイルを Base64 でエンコードして送信するシナリオによく遭遇します。
一般的な使用例としては、データURIスキーム(data:image/png;base64,...)を使用して画像をHTMLに直接埋め込んだり、JSONペイロード内でバイナリデータを送信したりすることが挙げられます。
しかし、Base64エンコーディングを行うと、ファイルサイズが元のサイズと比較して約 33% 増加することをご存知でしたか?
この記事では、なぜそうなるのかを正確に理解するために、Base64の仕組みを探ります。
1. Base64とは何か?
すべてのコンピュータデータは バイナリ(0と1)で構成されています。
しかし、電子メールやHTMLのようなテキストベースのプロトコルは、生のバイナリデータを扱う際に制限があります。制御文字や特定のビットパターンは、これらのシステムで誤動作を引き起こす可能性があります。
Base64 は、バイナリデータを 64個の安全なASCII文字 だけで構成されるテキストに変換するエンコーディング方式です。
使用される64文字は以下の通りです:
A-Z(26)a-z(26)0-9(10)+,/(2)- (そしてパディング用の
=)
2. 33%増加の背後にある数学
Base64エンコーディングの核心的な原理は、「3バイトを4文字に変換する」 ことです。
- 元のデータ: 3バイトは ビットに相当します。
- 変換: これらの24ビットは、各6ビット の4つのグループに分割されます。()
- エンコーディング: 各6ビットグループ(値0-63)は、Base64インデックステーブルの文字にマッピングされます。
なぜ増加するのか?
元のデータの3バイト(24ビット)を表現するために、Base64は4バイト(4つのASCII文字、32ビット)を使用します。
つまり、3バイトの情報を保存するために4バイトのスペースを消費します。
これが、Base64でエンコードするとデータサイズがおよそ33%増加する数学的な理由です。
3. パディング(=)の役割
元のデータの長さが3の倍数でない場合はどうなるでしょうか?
余りのビットがある場合、Base64は全体の長さを4の倍数にするために、末尾に = 文字を追加します。これを パディング と呼びます。
- 1バイト余る場合: 2つの
=を追加 - 2バイト余る場合: 1つの
=を追加
したがって、Base64文字列の末尾にある = は、データの終わりを示し、長さを揃える役割を果たします。
結論
Base64は、テキストベースの環境でバイナリデータを安全に送信するための不可欠なツールです。
しかし、33%のサイズオーバーヘッドは、ネットワーク帯域幅や読み込み速度に影響を与える可能性があります。
そのため、大きなファイルの場合は、Base64の代わりにバイナリ送信を検討するか、パフォーマンスを最適化するために控えめに使用してください。
関連ツールを見る
Pockitの無料開発者ツールを試してみましょう