Base64 のサイズを計算する方法
- バイト数 → Base64 の長さ を選んだまま 元のサイズ を入力し、単位 を選びます。単位 の設定では、サイズの測り方に合わせて 1 KB = 1000 B か 1 KiB = 1024 B を選んでください。
- または、ファイルをボックスにドロップします。読み取るのはサイズだけで、ファイルの中身は開きません。
- 表を確認します。パディングあり・なしの長さ、増加率(%)、任意の折り返し(1 行の長さ と 改行コード を設定)、MIME メールの行、PEM 本体、ファイルの MIME タイプ付きの
data:URI、引用符を含む JSON 文字列が並びます。 - 逆方向の計算には Base64 の長さ → バイト数 に切り替え、長さを入力し、改行を含むかどうかを指定して、パディング の状態を選びます。既知、不明(0~2 個)、なしのいずれかです。Base64 そのものを貼り付ければ正確な値が出ます。
表の下のライブ数式は、入力した数値で計算をもう一度示します。コードのコメントやチケットに書くときに便利です。
公式と 33% になる理由
Base64 は 3 バイトごとに 4 文字に変換し、1 文字が 6 ビットを運びます。最後のグループは = で 4 文字に揃えられるので、次のようになります。
padded = 4 × ⌈n ÷ 3⌉
unpadded = ⌈4n ÷ 3⌉
decoded = (characters × 3 ÷ 4) − number of "=" signs
大きな入力では一律 33.3% の増加です。小さな入力ではパディングが支配的になり、1 バイトが 4 文字になるので増分は 300% です。次の表は、計算ツールと同じコードで作成しました。
| 元のサイズ | Base64(パディングあり) | パディングなし | MIME(76 + CRLF) | PEM(64 + LF) |
|---|---|---|---|---|
| 1 バイト | 4 | 2 | 4 | 4 |
| 100 バイト | 136 | 134 | 138 | 138 |
| 1,000 バイト(1 KB) | 1,336 | 1,334 | 1,370 | 1,356 |
| 1,024 バイト(1 KiB) | 1,368 | 1,366 | 1,402 | 1,389 |
| 1,048,576 バイト(1 MiB) | 1,398,104 | 1,398,102 | 1,434,896 | 1,419,949 |
| 5,000,000 バイト(5 MB) | 6,666,668 | 6,666,667 | 6,842,106 | 6,770,834 |
改行は行と行の間だけで数え、最終行の後には付けていません。Python の base64.encodebytes など一部のエンコーダーは、最終行も含めすべての行を \n で終えるので、改行が 1 つ増えます。data URI の場合はプレフィックスを足してください。data:image/png;base64, は 22 文字です。
サイズ上限を見越した計画
何かが失敗する前に確かめておきたい、典型的な上限です。
- リクエストボディの上限。 エンドポイントが 10,000,000 バイトまで受け付け、ファイルを JSON フィールドに入れる場合、ファイルは最大で約 7,500,000 バイトから JSON の残りの部分を引いた大きさです。逆方向モードに切り替えて上限値を入力し、フィールド名などの分を引いてください。
- データベースのカラムと環境変数。
VARCHAR(255)に入る Base64 は最大 189 バイト分です。190 バイトだとすでに 256 文字が必要になります。 - メール。 MIME の添付ファイルは 76 文字ごとに CRLF で折り返されるので、全体で約 37% 増えます。そのため、メッセージサイズの上限に対して送れるファイルは上限の約 73% までです。詳しくは メールの Base64 を参照してください。
- HTML や CSS の data URI。 インライン化した画像は、どれもファイルより 3 分の 1 大きくなり、個別にキャッシュすることもできません。それでも得になる場合については data URI のパフォーマンス で解説しています。
コードで Base64 の長さを求める
どの言語でも、実際にエンコードせずに計算できます。
import math
def b64_len(n, padded=True):
return 4 * math.ceil(n / 3) if padded else math.ceil(4 * n / 3)
print(b64_len(1048576), b64_len(1048576, padded=False))
これは 1398104 1398102 を出力します。JavaScript では、パディングありの長さは 4 * Math.ceil(n / 3) です。手元の文字列を確認するには、改行を取り除いたうえで len(s) * 3 // 4 - s.count("=") を計算すればデコード後のサイズがわかります。逆方向モードで 4 で割った余りが 1 になるような、ありえない長さと表示された場合は文字列が壊れています。Base64 検証ツール で問題の位置を調べてください。
よくある質問
Base64 の長さを求める公式は?
n バイトに対して、パディングありなら 4 × ⌈n ÷ 3⌉ 文字、パディングなしなら ⌈4n ÷ 3⌉ 文字です。改行、data: プレフィックス、JSON の引用符はこれとは別に加わります。
Base64 からデコードしたファイルの大きさは?
Base64 の文字数(改行を除く)に 3 を掛けて 4 で割り、末尾の = 1 つにつき 1 バイトを引きます。1,400,000 文字の文字列なら、パディングによって 1,049,998~1,050,000 バイトになります。
リクエスト上限 10 MB の API で送れる最大のファイルサイズは?
上限が 10,000,000 バイトなら、10,000,000 × 3 ÷ 4 = 7,500,000 なので約 7.5 MB です。そこから文字列を囲む JSON フィールドやヘッダーの分を引きます。正確な値は、上限値を長さとして逆方向モードに入力すれば求められます。
gzip で Base64 の増分は打ち消せますか?
転送時にはおおむね打ち消せます。gzip は Base64 を元のバイト列とほぼ同じサイズまで縮めます。ランダムな 1,000,000 バイトは Base64 で 1,333,336 文字になり、gzip すると 1,009,976 バイトです。ただし、JSON フィールド、データベースのカラム、圧縮しないリクエストなど、テキストそのものを数える上限では 3 分の 1 の増分がそのまま効きます。