Saltar al contenido

Por qué el tamaño del archivo aumenta en un 33% con la codificación Base64

Categoría: Codificación
Este artículo está disponible actualmente solo en japonés. Estamos trabajando en las traducciones.

¿Alguna vez has oído que 「el tamaño del archivo aumenta aproximadamente un 33% cuando se codifica en Base64」? ¿Por qué es esto? Este artículo explica cómo funciona la codificación Base64, las razones matemáticas del aumento de tamaño de archivo y su impacto en entornos de desarrollo.

¿Qué es Base64?

Base64 es un esquema de codificación que representa datos binarios usando solo caracteres ASCII. Se utiliza para transmitir datos binarios a través de protocolos de solo texto, como archivos adjuntos de correo (MIME), esquemas de URI de datos, tokens JWT y encabezados de autenticación básica.

Los caracteres utilizados son <code>A–Z</code> (26 caracteres), <code>a–z</code> (26 caracteres), <code>0–9</code> (10 caracteres), <code>+</code>, <code>/</code> para un total de 64 caracteres (= Base<strong>64</strong>), más <code>=</code> para relleno.

Por qué aumenta un 33%

Base64 <strong>convierte 3 bytes de datos binarios en 4 caracteres ASCII</strong>.

  • 3 bytes = 24 bits
  • 24 bits ÷ 6 bits = 4 caracteres Base64 (cada carácter representa 6 bits)

En otras palabras, los datos originales se convierten en <strong>3 bytes → 4 caracteres</strong>. La relación de tamaño es <code>4 ÷ 3 ≈ 1.333...</code>, por lo que <strong>aumenta aproximadamente un 33.3%</strong>.

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

Cálculo del aumento de tamaño concreto

Tamaño del archivo originalTamaño después de Base64Cantidad de aumento
1 MB(1,000,000 B)Aproximadamente 1.333 MB+333 KB
10 MBAproximadamente 13.33 MB+3.33 MB
25 MB (límite de Gmail)Aproximadamente 33.3 MB+8.33 MB
100 MBAproximadamente 133.3 MB+33.3 MB

La fórmula exacta es la siguiente.

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%

Aumento adicional debido a caracteres de salto de línea

El estándar MIME (correo electrónico) requiere que los datos Base64 se dividan en líneas cada 76 caracteres con <code>\r\n</code> (CRLF). Estos saltos de línea también agregan bytes adicionales, aumentando ligeramente el tamaño general.

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バイト/行

Impacto en el desarrollo

Transferencia de archivos a través de API

Al enviar un archivo incluido en un cuerpo JSON a través de REST API, se requiere codificación Base64.

// ファイルを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 })
    });
};

En este caso, el límite de tamaño de solicitud de la API se determina por el tamaño <em>después</em> de la codificación Base64. Tenga en cuenta que al enviar un archivo de 10MB, el cuerpo JSON será de aproximadamente 13.3MB o superior.

Adjunto de correo electrónico (SMTP)

Debido a que el protocolo SMTP se basa en texto ASCII, los archivos adjuntos se codifican en Base64. El límite de adjuntos de Gmail es de 25 MB, que se refiere al tamaño del archivo antes de la codificación (Gmail maneja la codificación interna). Sin embargo, cuando se envía directamente a través de SMTP, el límite de tamaño se aplica al tamaño codificado, por lo que se requiere precaución.

URI de datos para etiqueta img

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

Al incrustar imágenes en línea en HTML, el archivo HTML se vuelve más grande por el tamaño Base64 de la imagen. Generalmente se recomienda evitar la incrustación en línea de imágenes grandes ya que afecta la velocidad de carga de la página.

Decodificar Base64 y restaurar al tamaño original

Resumen

  • Base64 convierte <strong>3 bytes → 4 caracteres</strong>, causando un aumento de tamaño de <strong>aproximadamente 33.3%</strong>
  • Se incrementa ligeramente más cuando hay saltos de línea MIME (cada 76 caracteres)
  • Para API que Envían Archivos a través del Cuerpo JSON, el Límite de Solicitud se Determina por el Tamaño Posterior a Base64
  • La codificación Base64 no es necesaria para formularios HTML con <code>multipart/form-data</code> (el binario se envía tal cual)

Archivos de prueba para este artículo

  • → <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de Archivos de Prueba de Imagen PNG</a>
  • → <a href="/ja/files/pdf/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de archivos de prueba PDF</a>

Artículos relacionados

  • → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">Calcular con Precisión el Overhead de multipart/form-data</a>
  • → <a href="/ja/blog/file-format-quick-reference/" class="text-primary-600 dark:text-primary-400 hover:underline">Referencia Rápida de Formatos de Archivo para Desarrolladores</a>