Base64とは:なぜ末尾に = が付き、なぜ約1.33倍になるのか
更新日:2026-09-17
メールの添付ファイルやデータURLの中に、英数字が延々と並んだ文字列を見かけることがあります。多くは Base64 です。仕組みを整理します。
何をしているのか
Base64 は、任意のバイト列を64種類の文字だけで表す変換です。使う文字は A-Z、a-z、0-9、+、/ の64種類です。
目的は「文字しか通せない場所にバイト列を通すこと」です。メールの本文やJSONの文字列など、そのままではバイナリを扱えない場所で使われます。
3バイトを4文字に分ける
変換の単位は3バイトです。3バイト=24ビットを6ビットずつ4つに分け、それぞれを64種類の文字に対応させます。
「ABC」の場合
A B C のバイト列 … 41 42 43(24ビット)
6ビットずつ4つに分ける
→ QUJD(4文字)
末尾の = はパディング
元のデータが3バイトの倍数でないとき、4文字に足りない分を = で埋めます。これがパディングです。
| 元のデータ | バイト数 | Base64 | = の数 |
|---|---|---|---|
| ABC | 3 | QUJD | 0個 |
| AB | 2 | QUI= | 1個 |
| A | 1 | QQ== | 2個 |
= は0個・1個・2個のいずれかで、3個以上になることはありません。末尾の = の数を見れば、元のデータのバイト数が3で割り切れるかどうかがわかります。
約1.33倍になる
3バイトが4文字になるので、データ量は4÷3=約1.33倍になります。パディングを含めるともう少し増えます。
画像をデータURLとしてHTMLに埋め込むと、元のファイルより3割ほど大きくなるのはこのためです。小さなアイコンなら通信を1回減らせる利点が上回ることがありますが、大きな画像では不利になります。
日本語を Base64 にすると
日本語も、いったんバイト列にしてから変換します。UTF-8 なら1文字3バイトが多いので、3文字で9バイト=12文字になります。
「テスト」の場合
UTF-8のバイト列 … E3 83 86 E3 82 B9 E3 83 88(9バイト)
Base64 … 44OG44K544OI(12文字)
9バイトがちょうど3の倍数なので、パディングは付きません。
暗号ではない
Base64 は誰でも元に戻せます
Base64 は変換であって暗号化ではありません。鍵は不要で、変換表さえあれば誰でも元のデータに戻せます。パスワードや個人情報を Base64 にしても、秘密にしたことにはなりません。読みにくくなるだけです。
URLセーフな変種
標準の Base64 は + と / を使いますが、この2文字はURLの中で意味を持ちます。そこで、+ を - に、/ を _ に置き換えた変種があります。URLセーフBase64と呼ばれます。
パディングの = も省略されることがあります。URLに含まれる文字列を戻すときは、この置き換えを元に戻してから復号します。
見分け方
Base64 かどうかは、次の特徴から見当がつきます。
- 英数字と
+/=だけでできている - 長さが4の倍数になっている(パディングを含む場合)
- 末尾に
=が0〜2個ある
テキスト変換では、貼り付けた文字列の形式を自動で判定して戻せます。Base64 かURLエンコードか判断がつかない場合も、そのまま貼って試せます。
まとめ
- 3バイトを4文字に置き換え、64種類の文字だけで表す
- 末尾の
=はパディングで、0〜2個になる - データ量は約1.33倍になる
- 暗号ではなく、誰でも元に戻せる
- URLで使うときは
+/を置き換えた変種を使う
この記事の位置づけ
仕様と一般的な動作を整理したものです。実際の挙動はブラウザやアプリの実装、受け取り側のシステムによって変わることがあります。業務で使う場合は、実際のデータで往復して確かめておくと安全です。
参考・出典
- RFC 3986: Uniform Resource Identifier (URI)
- RFC 4648: The Base16, Base32, and Base64 Data Encodings
- WHATWG Encoding Standard
※2026年9月時点の仕様と、主要なブラウザでの動作にもとづいています。