PC・モバイルのトラブル

なぜBase64にするとファイルが大きくなるのか

Base64はバイナリをだいたい3分の1ほど大きくします。3バイトが4文字になる構造、パディング、Data URLのオーバーヘッド、その増加が見合うときを確認します。

要点

Base64はバイナリ3バイトを印字可能なBase64文字4つで表すため、バイナリデータはだいたい3分の1ほど大きくなります。

入力長が3の倍数でないとき、標準のパディング付きBase64は = を付けることがあります。エンコード後の長さは 4 × ceil(n / 3) で、n は元のバイト数です。

「約33%」は大きな入力の話です。ごく短い入力はパディングで比率が大きく見えます。Base64は圧縮ではありません。エンコードと暗号化の違いは [Base64は暗号化ではない:実際に何をするのか](/ja/story/base64-is-not-encryption) を見てください。

この記事は、Base64の出力が元のバイトより大きくなる理由を説明します。セキュリティ案内ではありません。エンコードと暗号化の違いが必要なら Base64は暗号化ではない:実際に何をするのか を使ってください。

なぜBase64は場所を余分に取るのか

3バイトは24ビットです。Base64はその24ビットを6ビットずつ4グループに分けます。各グループがBase64文字1つになるので、入力3バイトは出力4文字になります。ASCII文字1つを1バイトで格納すると 4 / 3 ≈ 1.333、約33.3%の増加です。

  • 3バイト(24ビット)
  • 6ビットのグループ4つに分割
  • 各グループ → Base64文字1つ
  • 4文字(テキストとして多くの場合4バイト)
3バイト → 4文字の段階がサイズのコストです。短い入力ではパディングが少し加わることがあります。

確認できる簡単な例

次のエンコードは、標準のパディング付きBase64と一致します。

Man

Man

Base64

TWFu

Man は UTF-8/ASCII の3バイトです。TWFu は4文字です。3 → 4。

Hello

Hello

Base64

SGVsbG8=

Hello は5バイトです。SGVsbG8= は = を1つ含めて8文字です。小さなデータでは、パディングで比率が33%より大きく見えます。

Base64のサイズはどう計算するか

標準のパディング付きBase64では、encodedLength = 4 × ceil(originalBytes / 3) です。

元のバイト数 Base64文字数
14
24
34
48
58
68

1バイトや2バイトでも4文字になります。固定の33%ではなく、この式を使ってください。

「=」パディングは何を意味するか

= は、最後の3バイトブロックが埋まっていなかったことを示します。入力1バイトは = が2つ、2バイトは1つ、3バイトは無しです。パディングは暗号化でもセキュリティ機能でもありません。

Base64URLは場所を節約するか

Base64URLは + を - に、/ を _ に変え、Base64エンコード・デコード はエンコード時に末尾の = を省きます。その = の分だけ文字列は短くなり得ます。3バイト → 4文字の構造は同じなので、Base64URLがより省スペースなバイナリ形式というわけではありません。

ごく短い入力はなぜ33%を超えて増えるのか

1バイト → 4文字は長さ300%増です。2バイト → 4は100%です。3バイト → 4は約33.3%です。n が大きくなるとパディングの影響は相対的に小さくなり、オーバーヘッドは約33%に近づきます。Base64が常にちょうど33%大きいわけではありません。

Base64のData URLはなぜさらに大きいのか

Data URLはペイロードの前に data:image/png;base64, のような接頭辞を付けます。ごく小さなファイルでは、その接頭辞が比率の大半を占めることがあります。Base64エンコード・デコード は生のBase64もData URLも出せます。Data URL出力は標準のアルファベットを使います。

Base64とバイナリ、どちらが小さいか

生のバイナリは転送と保存のスペース効率が良いです。Base64は大きいですが、JSON、メール、その他テキスト専用の経路ではテキストとして安全です。バイナリからテキストへのエンコードであり、圧縮ではありません。

Base64はファイルを圧縮するか

しません。Base64は圧縮形式ではありません。エンコードしたテキストは通常、元のバイトより大きいです。そのテキストに後から gzip や Brotli をかければ、冗長の一部は縮むことがあります。結果はデータと圧縮器に依ります。gzip がBase64のオーバーヘッドを完全に消すわけではありません。

Base64をgzipするとどうなるか

HTTP圧縮はBase64テキストの繰り返しパターンの一部を減らせます。JPEG、PNG、ZIPは生バイトでも圧縮しにくいことが多く、Base64のあと gzip しても場合によります。gzip 後の一律の追加パーセントはありません。

ファイルをBase64で保存すべきか

JSONのフィールド、小さなインライン資産、テキスト専用API、コピー&ペースト、Data URLにはBase64が合うことがあります。大きなファイルでは保存、メモリ、ペイロードがすべて増えます。「ファイルにBase64を使うな」という意味ではありません。

JSON APIでBase64がよく使われる理由

JSONには生バイナリの型がないので、APIはバイトをBase64文字列に入れることがよくあります。大きなファイルでは multipart/form-data、オブジェクトストレージ、直接のバイナリアップロードの方が合うことがあります。どちらが常に最善というわけではありません。

メールでBase64が使われる理由

MIMEはバイナリ添付をテキストとして安全な文字で運ぶためにBase64を使うことがあります。同じサイズのオーバーヘッドはそのままです。より小さいファイルではなく、転送用の表現です。

いつ余分なサイズが見合うか

バイナリをテキストの中に置かねばならないとき、ペイロードが小さいとき、APIがBase64を求めるとき、Data URLが必要なときは、余分なサイズが見合うことがあります。大きなメディアでは、システムが許すなら生バイナリを優先してください。

いつBase64を避けるべきか

大きなファイル、帯域が厳しいとき、頻繁な転送、すでにバイナリ経路があるときは飛ばしてください。状況の話であり、「Base64は悪い習慣」ではありません。

確認できるパディング付きBase64の長さ

元のバイト数と、標準のパディング付きBase64文字数:

元のバイト Base64文字
14
24
34
1016
100136
1,0001,336

すべての行は 4 × ceil(n / 3) に従います。これはBase64の文字数です。

例:1,000バイトのファイルはどれくらいになるか

4 × ceil(1000 / 3)。ceil(333.333…) = 334、4 × 334 = 1336 です。つまり1,000バイトはBase64文字1,336個になります。UTF-8/ASCIIで保存すると文字は通常1バイトですが、1,336を正確なメモリ上のバイト数とは見なさないでください。

Base64はファイルサイズ以上にメモリを使うか

ランタイムによっては文字あたり1バイト超で文字列を持ち、エンコードとデコードのあいだバッファと文字列が同時に残ることがあります。メモリ使用量は文字長とちょうど同じではありません。

簡単なサイズ判断の案内

システムが生バイナリを受け付けるなら、サイズのためそれを優先してください。テキストしかだめならBase64が合うことがあります。大きなペイロードならバイナリアップロード経路を確認してください。URL安全なテキストならBase64URLを検討してください。3対4の拡大はそのままです。

  • バイナリデータを送る必要がある
  • 生バイナリが使える?サイズのためバイナリを優先
  • テキスト専用フィールド?Base64が適切なことがある
  • 大きなペイロード?バイナリアップロード経路を確認
  • URL安全なテキストが必要?Base64URLを検討
  • 大きな入力ではテキストが約33%増えると見込む
Base64が買うのはテキスト互換です。より小さいファイルではありません。
Base64はスペースをテキスト互換と交換する

Base64はデータを小さくする設計ではありません。テキスト系のシステム内でバイナリを表しやすくし、その対価が余分なサイズです。

ブラウザでBase64をエンコード・デコードする

NEXNARA Base64エンコード・デコード はテキストをエンコード・デコードし、ファイルをBase64またはData URLにし、Base64をファイルに戻せます。

テキストはUTF-8バイトにしてからBase64です。ASCIIだけではありません。StandardかBase64URLを選びます。ファイル出力は生Base64またはData URL(標準アルファベット)です。不正な入力は拒否されます。UTF-8でないバイトはテキストデコードではなく、ファイルへ戻してください。

10 MB を超えるファイルはタブが遅くなることがあります(警告)。32 MB を超えるファイルはブロックされます。

エンコードとデコードはこのブラウザ内で行います。このツールのためにファイルがNEXNARAサーバーへ送られることはありません。広告や他のサイト機能はネットワークを使います。

Base64エンコード・デコード にテキストやファイルを入れて、元のバイトとエンコード後の長さを比べてください。

FAQ

なぜBase64はファイルサイズを増やすのか

3バイト(24ビット)を4文字(4 × 6ビット)に対応づけます。テキストとして保存すると、大きな入力ではだいたい3分の1増えます。

Base64は常に33%大きいのか

いいえ。大きな入力は約33.3%に近づきます。ごく短い入力はパディングでもっと増えます。4 × ceil(n / 3) を使ってください。

Base64はバイナリよりどれだけ大きいか

標準のパディング付き長さは 4 × ceil(n / 3) 文字です。Data URLの接頭辞がさらに加わります。

Base64圧縮はファイルを小さくするか

Base64は圧縮しません。エンコードしたテキストに gzip や Brotli をかけると一部は縮むことがありますが、どの場合でもオーバーヘッドが消えるわけではありません。

Base64URLは場所を節約するか

= パディングを落とせるので、文字列が0〜2文字短くなることがあります。3対4のエンコード構造は同じです。

大きなファイルにBase64を使うべきか

テキストが必要なときだけです。大きいか頻繁な転送では、バイナリ経路の方が小さいことが多いです。APIでBase64が常に誤りというわけではありません。