Base64エンコーディングはコンピューティングにおける最も基本的なデータエンコーディングスキームの一つです。毎日何百万もの開発者がbase64エンコードとbase64デコード操作を使用して、HTMLへの画像埋め込み、テキストベースプロトコルでのバイナリデータ送信、認証トークンの処理を行っています。この包括的なガイドでは、6ビットマッピングアルゴリズムからJavaScript、Python、Bash、PowerShellの実践的なコード例まで、すべてをカバーします。
無料オンラインBase64エンコード/デコードツールをお試しください。
Base64エンコーディングとは?
Base64は、64個の印刷可能なASCII文字を使ってバイナリデータを表現するバイナリからテキストへのエンコーディングスキームです。アルファベットはA-Z(26)、a-z(26)、0-9(10)、+と/で構成されます。=はパディングに使用されます。エンコーダーは入力を3バイト(24ビット)のグループで処理し、4つのBase64文字に変換します。
アルゴリズムは3バイトごとに4つの6ビットグループに分割します。各6ビット値(0〜63)はBase64アルファベットの1文字にマッピングされます。入力長が3の倍数でない場合、=パディング文字が追加されます。
Base64エンコーディングはデータサイズを約33%増加させます。これはテキストのみのチャネルでバイナリデータを安全に送信するためのトレードオフです。
Base64エンコード/デコードの仕組み
ASCII文字列ManをBase64に変換するプロセスをステップバイステップで見てみましょう:
- ASCIIバイトに変換:
M=77、a=97、n=110。 - ビットを連結:合計24ビット。
- 6ビットグループに分割:4グループ。
- 10進数に変換:19、22、5、46。
- Base64文字にマッピング:T、W、F、u。
結果はTWFuです。デコードするにはプロセスを逆にします。
パディング例:Ma(2バイト)のエンコード結果はTWE=。1バイトのMはTQ==になります。
Base64の一般的な使用例
Base64エンコーディングは現代のソフトウェア開発のあらゆる場所に存在します:
データURI(Base64画像エンコード):data:image/png;base64,...でHTML/CSSに画像を直接埋め込み、追加のHTTPリクエストを削減できます。
メール添付ファイル(MIME):MIME標準はメールのバイナリ添付ファイルをBase64でエンコードします。
API認証(HTTP Basic Auth):HTTP基本認証はユーザー名:パスワードをBase64でエンコードします。
JSON Web Token(JWT):JWTはBase64URLでエンコードされた3つのセグメントで構成されます。
URL安全データ転送:Base64はデータが安全なASCII文字のみを含むことを保証します。
Base64エンコード/デコードのコード例
JavaScript Base64エンコード/デコード
ブラウザではbtoa()でエンコード、atob()でデコードします。Node.jsではBufferを使用します:
// ===== Browser: btoa() and atob() =====
// Base64 encode a string
const encoded = btoa('Hello World');
console.log(encoded); // "SGVsbG8gV29ybGQ="
// Base64 decode a string
const decoded = atob('SGVsbG8gV29ybGQ=');
console.log(decoded); // "Hello World"
// Handle Unicode strings (btoa only supports Latin-1)
function base64EncodeUnicode(str) {
return btoa(encodeURIComponent(str).replace(
/%([0-9A-F]{2})/g,
(_, p1) => String.fromCharCode(parseInt(p1, 16))
));
}
function base64DecodeUnicode(str) {
return decodeURIComponent(
Array.from(atob(str))
.map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0'))
.join('')
);
}
base64EncodeUnicode('Hello 🌍'); // "SGVsbG8g8J+MjQ=="
base64DecodeUnicode('SGVsbG8g8J+MjQ=='); // "Hello 🌍"
// ===== Node.js: Buffer =====
// Encode
const buf = Buffer.from('Hello World', 'utf-8');
const b64 = buf.toString('base64');
console.log(b64); // "SGVsbG8gV29ybGQ="
// Decode
const original = Buffer.from(b64, 'base64').toString('utf-8');
console.log(original); // "Hello World"
// URL-safe Base64 in Node.js
const urlSafe = buf.toString('base64url');
console.log(urlSafe); // "SGVsbG8gV29ybGQ"Python Base64エンコード/デコード
Pythonでは組み込みのbase64モジュールを使用します:
import base64
# Standard Base64 encode
text = "Hello World"
encoded = base64.b64encode(text.encode('utf-8'))
print(encoded) # b'SGVsbG8gV29ybGQ='
print(encoded.decode()) # "SGVsbG8gV29ybGQ="
# Standard Base64 decode
decoded = base64.b64decode(encoded)
print(decoded.decode('utf-8')) # "Hello World"
# URL-safe Base64 (replaces + with - and / with _)
url_encoded = base64.urlsafe_b64encode(text.encode('utf-8'))
print(url_encoded.decode()) # "SGVsbG8gV29ybGQ="
url_decoded = base64.urlsafe_b64decode(url_encoded)
print(url_decoded.decode('utf-8')) # "Hello World"
# Encode a file (e.g., an image)
with open('image.png', 'rb') as f:
image_b64 = base64.b64encode(f.read()).decode('utf-8')
data_uri = f"data:image/png;base64,{image_b64}"
# Decode Base64 back to file
with open('output.png', 'wb') as f:
f.write(base64.b64decode(image_b64))Bash / Linux Base64エンコード/デコード
Linux/macOSではbase64コマンドを使用します:
# Base64 encode a string (Linux)
echo -n "Hello World" | base64
# Output: SGVsbG8gV29ybGQ=
# Base64 decode a string (Linux)
echo "SGVsbG8gV29ybGQ=" | base64 --decode
# Output: Hello World
# macOS uses -D instead of --decode
echo "SGVsbG8gV29ybGQ=" | base64 -D
# Output: Hello World
# Base64 encode a file
base64 image.png > image_b64.txt
# Base64 decode a file
base64 --decode image_b64.txt > restored_image.png
# Encode and use inline (e.g., for curl auth header)
AUTH=$(echo -n "user:password" | base64)
curl -H "Authorization: Basic $AUTH" https://api.example.com/data
# Pipe from/to files
cat document.pdf | base64 > document_b64.txt
cat document_b64.txt | base64 --decode > restored.pdf
# Wrap lines at 76 characters (MIME standard)
echo -n "Long text..." | base64 -w 76PowerShell Base64エンコード/デコード
PowerShellでは.NETの[Convert]クラスを使用します:
# PowerShell Base64 encode (UTF-16LE by default)
$text = "Hello World"
$bytes = [System.Text.Encoding]::UTF8.GetBytes($text)
$encoded = [Convert]::ToBase64String($bytes)
Write-Output $encoded
# Output: SGVsbG8gV29ybGQ=
# PowerShell Base64 decode
$decoded = [Convert]::FromBase64String($encoded)
$original = [System.Text.Encoding]::UTF8.GetString($decoded)
Write-Output $original
# Output: Hello World
# Encode a file to Base64
$fileBytes = [IO.File]::ReadAllBytes("C:\image.png")
$fileBase64 = [Convert]::ToBase64String($fileBytes)
# Decode Base64 to file
$decodedBytes = [Convert]::FromBase64String($fileBase64)
[IO.File]::WriteAllBytes("C:\restored.png", $decodedBytes)
# One-liner for encoding strings (UTF-8)
[Convert]::ToBase64String(
[Text.Encoding]::UTF8.GetBytes("Hello World")
)
# Using UTF-16LE (default Windows encoding)
$utf16 = [Convert]::ToBase64String(
[Text.Encoding]::Unicode.GetBytes("Hello World")
)
# Note: UTF-16LE produces different output than UTF-8Base64エンコーディングテーブル
完全なBase64アルファベットは各6ビット値(0-63)を印刷可能なASCII文字にマッピングします(RFC 4648):
| Value | Char | Value | Char | Value | Char | Value | Char |
|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w |
| 1 | B | 17 | R | 33 | h | 49 | x |
| 2 | C | 18 | S | 34 | i | 50 | y |
| 3 | D | 19 | T | 35 | j | 51 | z |
| 4 | E | 20 | U | 36 | k | 52 | 0 |
| 5 | F | 21 | V | 37 | l | 53 | 1 |
| 6 | G | 22 | W | 38 | m | 54 | 2 |
| 7 | H | 23 | X | 39 | n | 55 | 3 |
| 8 | I | 24 | Y | 40 | o | 56 | 4 |
| 9 | J | 25 | Z | 41 | p | 57 | 5 |
| 10 | K | 26 | a | 42 | q | 58 | 6 |
| 11 | L | 27 | b | 43 | r | 59 | 7 |
| 12 | M | 28 | c | 44 | s | 60 | 8 |
| 13 | N | 29 | d | 45 | t | 61 | 9 |
| 14 | O | 30 | e | 46 | u | 62 | + |
| 15 | P | 31 | f | 47 | v | 63 | / |
Padding: =
Base64 URL安全エンコーディング
標準Base64は+と/を使用しますが、URLでは特別な意味を持ちます。Base64URLはこれらを-と_に置き換え、=パディングも通常省略します。
Base64URLはRFC 4648セクション5で定義され、JWT、OAuth 2.0 PKCE、多くのモダンAPIで使用されています。
標準Base64とBase64URLの比較:
// Standard Base64 vs Base64URL comparison
// Standard Base64 (RFC 4648 Section 4)
// Alphabet: A-Z, a-z, 0-9, +, /
// Padding: = (required)
"Hello World?" → "SGVsbG8gV29ybGQ/" // contains /
"subjects?" → "c3ViamVjdHM/" // contains /
"<<???>>" → "PDw/Pz8+Pg==" // contains + and =
// Base64URL (RFC 4648 Section 5)
// Alphabet: A-Z, a-z, 0-9, -, _
// Padding: omitted (optional)
"Hello World?" → "SGVsbG8gV29ybGQ_" // / replaced with _
"subjects?" → "c3ViamVjdHM_" // / replaced with _
"<<???>>" → "PDw_Pz8-Pg" // + → -, / → _, no padding
// JavaScript conversion between formats
function base64ToBase64Url(base64) {
return base64
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
}
function base64UrlToBase64(base64url) {
let base64 = base64url
.replace(/-/g, '+')
.replace(/_/g, '/');
// Add padding
while (base64.length % 4 !== 0) {
base64 += '=';
}
return base64;
}Base64画像エンコーディング
Base64の最も人気のある用途の一つは、データURIを使ってHTML/CSSに画像を直接埋め込むことです。形式:data:[メディアタイプ];base64,[データ]。
一般的な使用例:HTMLメールのインライン画像、CSSの小さなアイコン、JSON APIレスポンスの画像、SPAのアセットバンドル。
パフォーマンス:Base64画像は約33%大きくなります。数KB以上の画像は別ファイルとして提供する方が効率的です。Base64は小さな画像(10KB以下)に最適です。
HTMLでBase64画像を使用:
<!-- Inline Base64 image in HTML -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAADElEQVQI12P4//8/AwAI/AL+hc2rNAAAAABJRU5E
rkJggg==" alt="Red dot" width="5" height="5" />
<!-- Base64 SVG in HTML -->
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDov
L3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMT
AwIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MCIgZmlsbD0icmVk
Ii8+PC9zdmc+" alt="Red circle" />
<!-- Base64 favicon -->
<link rel="icon" href="data:image/x-icon;base64,AAABAA..." />CSSでBase64画像を使用:
/* Base64 background image in CSS */
.icon-check {
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bW...');
background-size: contain;
width: 24px;
height: 24px;
}
/* Base64 cursor in CSS */
.custom-cursor {
cursor: url('data:image/png;base64,iVBORw0KGgo...'), auto;
}
/* Base64 font in CSS (@font-face) */
@font-face {
font-family: 'CustomFont';
src: url('data:font/woff2;base64,d09GMgABAAAAAD...') format('woff2');
}JavaScriptで画像をBase64に変換:
// Convert image file to Base64 data URI (browser)
function imageToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
// Usage with file input
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async (e) => {
const file = e.target.files[0];
const dataUri = await imageToBase64(file);
console.log(dataUri);
// "data:image/png;base64,iVBORw0KGgo..."
});
// Convert canvas to Base64
const canvas = document.getElementById('myCanvas');
const base64Image = canvas.toDataURL('image/png');
// "data:image/png;base64,iVBORw0KGgo..."
// Node.js: encode image file to Base64
const fs = require('fs');
const imageBuffer = fs.readFileSync('photo.jpg');
const base64String = imageBuffer.toString('base64');
const dataUri = `data:image/jpeg;base64,${base64String}`;よくある質問
Base64エンコーディングは何に使われますか?
Base64はバイナリデータをASCIIテキストに変換してテキストプロトコルで安全に送信するために使用されます。データURI、メール添付ファイル、JSON/XML API、HTTP Basic Auth、JWT、テキストデータベースでのバイナリ格納が主な用途です。
JavaScriptで文字列をBase64エンコードするには?
btoa("Hello World")で"SGVsbG8gV29ybGQ="を返します。デコード:atob("SGVsbG8gV29ybGQ=")。Unicode:btoa(unescape(encodeURIComponent(text)))。Node.js:Buffer.from("Hello World").toString("base64")。
Base64エンコーディングは暗号化と同じですか?
いいえ。Base64は鍵なしで誰でも復元できる可逆エンコーディングです。セキュリティは一切ありません。データ保護にはAES-256やRSAなどの暗号化を使用してください。
Base64エンコーディングはすべての開発者にとって基本的なスキルです。無料オンラインツールで即座にエンコードとデコードを行えます。