Skip to content

Warum die Dateigröße durch Base64-Codierung um 33% zunimmt

Kategorie:Kodierung
Dieser Artikel ist derzeit nur auf Japanisch verfügbar. Übersetzte Versionen werden schrittweise veröffentlicht.

Haben Sie schon gehört, dass 「die Dateigröße bei Base64-Codierung um etwa 33% zunimmt」? Warum ist das so? Dieser Artikel erklärt die Funktionsweise von Base64-Codierung, die mathematischen Gründe für die Vergrößerung der Dateigröße und deren Auswirkungen in der Entwicklung.

Was ist Base64

Base64 ist ein Codierungsverfahren, das Binärdaten nur mit ASCII-Zeichen darstellt. Es wird verwendet, um Binärdaten in Protokollen zu übertragen, die nur Text verarbeiten können, wie E-Mail-Anhänge (MIME), Daten-URI-Schemata, JWT-Token und Basic-Authentication-Header.

Die verwendeten Zeichen sind <code>A–Z</code> (26 Zeichen), <code>a–z</code> (26 Zeichen), <code>0–9</code> (10 Zeichen), <code>+</code>, <code>/</code>, insgesamt 64 Zeichen (=Base<strong>64</strong>), sowie <code>=</code> für das Padding.

Warum um 33% ansteigen

Base64 <strong>konvertiert 3 Bytes Binärdaten in 4 ASCII-Zeichen</strong>.

  • 3 Bytes = 24 Bits
  • 24 Bit ÷ 6 Bit = 4 Base64-Zeichen (jedes Zeichen stellt 6 Bit dar)

Mit anderen Worten werden die ursprünglichen Daten <strong>3 Bytes → 4 Zeichen</strong>. Das Größenverhältnis ist <code>4 ÷ 3 ≈ 1.333...</code>, daher gibt es eine <strong>Erhöhung von etwa 33,3%</strong>.

元バイナリ:   | 0x4D | 0x61 | 0x6E |  ← 3バイト
              01001101 01100001 01101110
              ↓ 6ビットずつに分割
              010011 010110 000101 101110
              ↓ Base64文字に変換
                 T       W       F       u   ← 4文字(= 4バイト)

Berechnung der konkreten Größenzunahme

Ursprüngliche DateigrößeGröße nach Base64Inkrementwert
1 MB(1,000,000 B)Ungefähr 1.333 MB+333 KB
10 MBUngefähr 13.33 MB+3.33 MB
25 MB (Gmail-Limit)Ungefähr 33.3 MB+8.33 MB
100 MBUngefähr 133.3 MB+33.3 MB

Die genaue Berechnungsformel ist wie folgt.

import math

def base64_size(original_bytes: int) -> int:
    """Base64エンコード後のバイト数を計算"""
    # 3バイトを4文字に変換、4の倍数にパディング
    return math.ceil(original_bytes / 3) * 4

original = 10_000_000  # 10 MB
encoded  = base64_size(original)
print(f"元: {original:,} B")
print(f"後: {encoded:,} B")
print(f"増加率: {encoded/original*100:.1f}%")
# → 元: 10,000,000 B
# → 後: 13,333,336 B
# → 増加率: 133.3%

Zusätzliche Zunahme durch Zeilenumbruchzeichen

Nach dem MIME-Standard (E-Mail) müssen Base64-Daten alle 76 Zeichen mit <code>\r\n</code> (CRLF) umgebrochen werden. Diese Zeilenumbrüche fügen ebenfalls Bytes hinzu und erhöhen die Größe geringfügig.

def base64_mime_size(original_bytes: int, line_length: int = 76) -> int:
    """MIME形式(76文字改行)のBase64サイズを計算"""
    b64_chars = math.ceil(original_bytes / 3) * 4
    line_count = math.ceil(b64_chars / line_length)
    return b64_chars + line_count * 2  # CRLF = 2バイト/行

Auswirkungen auf die Entwicklung

Dateiübertragung über API

Beim Senden einer Datei im JSON-Body einer REST-API ist Base64-Kodierung erforderlich.

// ファイルをBase64に変換してJSONで送る
const file = document.getElementById('file').files[0];
const reader = new FileReader();
reader.onload = (e) => {
    const base64 = e.target.result; // "data:image/png;base64,iVBORw0KGgo..."
    fetch('/api/upload', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ file: base64, name: file.name })
    });
};

In diesem Fall wird die Anfragegrößenbeschränkung der API basierend auf der Größe nach Base64 beurteilt. Beim Senden einer 10-MB-Datei beachten Sie, dass der JSON-Body ungefähr 13,3 MB oder mehr wird.

E-Mail-Anhang (SMTP)

Das SMTP-Protokoll basiert auf ASCII-Text, daher werden Anhänge mit Base64 codiert. Das Gmail-Anhanglimit beträgt 25 MB, aber dies bezieht sich auf die Dateigröße vor der Codierung (Gmail verarbeitet die Codierung intern). Beim direkten Versand über SMTP unterliegt jedoch die Größe nach der Codierung dem Limit, daher ist Vorsicht geboten.

Data URI des <code>img</code>-Tags

<!-- Base64埋め込み画像 -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

Beim Einbetten von Bildern inline in HTML wird die HTML-Datei um die Größe des Base64-kodierten Bildes vergrößert. Im Allgemeinen sollte das Inline-Einbetten großer Bilder vermieden werden, da es die Seitenladungsgeschwindigkeit beeinträchtigt.

Base64 dekodieren, um zur ursprünglichen Größe zurückzukehren

Zusammenfassung

  • Base64 konvertiert <strong>3 Bytes → 4 Zeichen</strong>, daher nimmt die Größe <strong>um etwa 33,3% zu</strong>
  • Mit MIME-Zeilenumbrüchen (alle 76 Zeichen) nimmt die Größe etwas weiter zu
  • Bei APIs, die Dateien im JSON-Body senden, wird das Anfragelimit durch die Größe nach Base64 bestimmt
  • Bei HTML-Formularen mit <code>multipart/form-data</code> ist Base64-Kodierung nicht erforderlich (binäre Daten werden so wie sie sind gesendet)

Testdatei zur Verwendung in diesem Artikel

  • → <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">PNG-Bild-Testdateiliste</a>
  • → <a href="/ja/files/pdf/" class="text-primary-600 dark:text-primary-400 hover:underline">Liste der PDF-Testdateien</a>

Verwandte Artikel

  • → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">Den Overhead von multipart/form-data genau berechnen</a>
  • → <a href="/ja/blog/file-format-quick-reference/" class="text-primary-600 dark:text-primary-400 hover:underline">Schnellreferenz Dateiformate für Entwickler</a>