Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式である。MIMEによって規定されていて、7ビットのデータしか扱うことの出来ない電子メールにて広く利用されている。具体的には、`A`、...、`Z`、`a`、...、`z`、`0`、...、`9` の62種類の文字と、2種類の記号 (`+`、`/`)、さらにパディング(余った部分を詰める)のための記号として `=` が用いられる。この変換によって、データ量は4/3(約133%)となり、増加する。また、MIMEの基準では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れるとデータ量は約137%となる。

## 変換形式

Base64変換の手順を以下に挙げる。

1. 元データを6ビットずつに分割する。(6ビットに満たない分は後ろに0を追加して6ビットにする)
2. 各6ビットの値を変換表を使って4文字ずつ変換する。
3. 4文字に足りない分は `=` 記号を後ろに追加する。

### 変換例

| 段階 | 状態 | データ |
| --- | --- | --- |
| 1 | 元データ | `"ABCDEFG"`(文字列) |
| 2 | 6ビットずつに分割 | `{010000, 010100, 001001, 000011, 010001, 000100, 010101, 000110, 010001, 11}`(ビット列の列) |
| 3 | 2ビット余るので、4ビット分0を追加して6ビットにする | `{010000, 010100, 001001, 000011, 010001, 000100, 010101, 000110, 010001, 110000}`(ビット列の列) |
| 4 | 変換表により、4文字ずつ変換する | `{"QUJD", "REVG"、"Rw"}`(文字列の列) |
| 5 | 最後の文字列が2文字足りないので、2文字分 `=` 記号を追加して4文字にする | `{"QUJD", "REVG", "Rw=="}`(文字列の列) |
| 6 | 連結してBase64文字列にする | `"QUJDREVGRw=="`(文字列) |

### 変換表

6ビットのビット列に対して一つの文字を対応づけているだけである。

## 主な利用例

### 電子メール

電子メールでは、SMTPなどの制約により、7ビット文字列以外をやり取りすることは出来ない。このため、添付ファイルなどのバイナリ形式のデータを送信する際に標準的に利用されている。

### Basic認証

HTTPヘッダでは、特殊記号を使用することが出来ないため、ユーザー名とパスワードをコロン (`:`) で区切ってBase64エンコードした文字列がBasic認証に用いられている。

### 電子掲示板

インターネット上の電子掲示板では、文字列以外のバイナリデータの書き込みは基本的に不可能である。そこで、画像やテキスト文章を圧縮したファイルなどをやり取りするために、この形式が使用されることがある。

## 問題点

このエンコードを行うとデータ量が大きく増加するため、特に大きなファイルの送受信などをする場合は、電子メール以外の手段を利用したほうが格段に速い場合がある。また、英文の中に特殊文字が混じっているテキスト文章などは、特殊文字だけをエンコードした方がデータ効率が良く、デコードを行わなくても大体のデータが読めると言う利点がある。(Quoted-printable参照)

## 変形版

URLにBase64を含ませると、`+` と `/` が問題を引き起こすことがある。これらの文字がURLで特別な意味を持つために `%h1h0`の形にエスケープする必要が生じるためである。
他にも、`+` と `/` が特別な意味をもつ個所(正規表現など)やその使用が制限される個所(XMLなど)でBase64を用いるときには、この2文字のかわりに `!`、`-`、`.` などを用いることがある。

| 変形 | 62番目の文字 | 63番目の文字 | パディング | 1行が固定長か | 行の最大長 | 改行文字 | 指定された文字以外を使えるかどうか | 行のチェックサム |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| オリジナルの Privacy-Enhanced Mail (PEM) の Base64 (RFC 1421、deprecated) | `+` | `/` | `=` (必須) | はい (最終行を除く) | 64 | CR+LF | 禁止 | (なし) |
| MIME の Base64 転送エンコーディング (RFC 2045) | `+` | `/` | `=` (必須) | いいえ (可変) | 76 | CR+LF | 許可 (破棄される) | (なし) |
| RFC 3548 や RFC 4648 の標準の 'Base64' エンコーディング | `+` | `/` | `=` (必須) | はい (最終行を除く) | 64 または 76 (改行が必要な場合のみ) | CR+LF (改行が必要な場合のみ) | 禁止 | (なし) |
| OpenPGP用「Radix-64」 (RFC 4880) | `+` | `/` | `=` (必須) | いいえ (可変) | 76 | CR+LF | 禁止 | 24ビットCRC (Radix-64-encoded, including one pad character) |
| UTF-7 のための変形 Base64 (RFC 1642、obsoleted) | `+` | `/` | (なし) | いいえ (可変) | (なし) | (なし) | 禁止 | (なし) |
| ファイル名のための変形 Base64 (非標準) | `+` | `-` | (なし) | いいえ (可変) | (ファイルシステムの限界、一般には255) | (なし) | 禁止 | (なし) |
| URLアプリケーションのための変形 Base64 ('base64url' encoding) | `-` | `_` | (なし) | いいえ (可変) | アプリケーション依存 | (なし) | 禁止 | (なし) |
| XML名前トークン向け修正Base64 (Nmtoken) | `.` | `-` | (なし) | いいえ (可変) | XML パーサー依存 | (なし) | 禁止 | (なし) |
| XML識別子向け修正Base64 (Name) | `_` | `:` | (なし) | いいえ (可変) | XML パーサー依存 | (なし) | 禁止 | (なし) |
| プログラム識別子向け修正Base64 (変種1,非標準) | `_` | `-` | (なし) | いいえ (可変) | 言語・システム依存 | (なし) | 禁止 | (なし) |
| プログラム識別子向け修正Base64 (変種2,非標準) | `.` | `_` | (なし) | いいえ (可変) | 言語・システム依存 | (なし) | 禁止 | (なし) |
| 正規表現のための変形 Base64 (非標準) | `!` | `-` | (なし) | いいえ (可変) | アプリケーション依存 | (なし) | 禁止 | (なし) |