Blog

¿Qué es un Magic Number de archivo? Detección de formato explicada

Publicado el 24 de abril de 2026 · 6 min de lectura

¿Cómo sabe el sistema operativo qué es un archivo?

Renombra un PNG a .txt. Quick Look de macOS sigue mostrándolo como imagen. Ejecuta file renamed.txt en Linux: la salida sigue siendo PNG image data. El nombre cambió, pero el formato no. ¿Por qué?

Porque muchos detectores de formato inspeccionan bytes del propio contenido —un magic number o firma de archivo— en vez de confiar solo en el nombre.

Las extensiones siguen influyendo en la asociación y apertura de archivos. Herramientas como <code>file</code> y algunos flujos MIME también inspeccionan bytes, pero no todos aplican las mismas reglas.

¿Qué es un Magic Number?

Cada formato de archivo reserva una secuencia fija de bytes al inicio del archivo para declarar su tipo. Estos se llaman magic numbers (también conocidos como firmas de archivo o cabeceras de archivo).

Piensa en un pasaporte: el control fronterizo no pregunta tu nombre — abre la primera página y confirma tu nacionalidad. Un magic number es la «primera página» de un archivo. Sin importar cómo se llame, esos primeros bytes revelan la verdad.

Así funciona el comando file de Unix: compara el contenido con una base de datos magic de patrones de bytes. Eso aporta evidencia sobre el formato, pero no sustituye al MIME, los metadatos del contenedor ni las reglas de cada programa.

Tabla de referencia rápida de Magic Numbers

Firmas de formato comunes que encontrarás en la práctica:

Formato Magic Bytes (Hex) ASCII Notas
PNG 89 50 4E 47 0D 0A 1A 0A ‰PNG.... 8 bytes, una de las firmas más reconocibles
JPEG FF D8 FF — 3 bytes; el 3.º varía según el subtipo
GIF 47 49 46 38 GIF8 Seguido de 37 (GIF87a) o 39 (GIF89a)
PDF 25 50 44 46 %PDF Seguido de la versión, p. ej. -1.7
WebP 52 49 46 46 … 57 45 42 50 RIFF…WEBP Contenedor RIFF; verificar bytes 8–11
WAV 52 49 46 46 … 57 41 56 45 RIFF…WAVE Contenedor RIFF; subtipo WAVE
MP3 49 44 33 / FF Fx ID3 / sync Con etiqueta ID3: inicia con ID3; sin etiqueta: palabra de sincronización FF Ex o FF Fx
FLAC 66 4C 61 43 fLaC Audio sin pérdida, firma inequívoca
MP4 / MOV / M4A 00 00 00 xx 66 74 79 70 ....ftyp Contenedor ftyp; verificar la marca en bytes 8–11
WebM 1A 45 DF A3 — Cabecera de contenedor EBML
OGG 4F 67 67 53 OggS Contenedor de audio/vídeo OGG
BMP 42 4D BM Mapa de bits de Windows

La trampa: cuatro bytes no siempre son suficientes

Dos familias de contenedores comparten prefijos comunes en tipos de medios completamente diferentes. Detenerse en el byte 4 dará un resultado incorrecto.

Contenedor RIFF (WebP / WAV / AVI)

WebP, WAV y AVI empiezan con RIFF (52 49 46 46). El subtipo real está en los bytes 8–11:

+0
RIFF
prefijo compartido
+4
tamaño de archivo (4 bytes)
+8
subtipo WEBP / WAVE / AVI
formato real aquí
+12
datos de chunk

Contenedor ftyp (MP4 / MOV / M4A)

MP4, MOV y M4A empiezan con un tamaño de caja variable de 4 bytes, luego ftyp en los bytes 4–7. El código de marca en bytes 8–11 determina el formato real:

+0
tamaño de caja (variable)
+4
ftyp
marcador fijo
+8
marca isom / M4A / qt
formato real aquí
+12
lista de compatibilidad

Códigos de marca clave: isom / iso2 / avc1 = MP4, M4A = M4A (audio Apple), qt = QuickTime MOV.

Pruébalo: el comando file lee los Magic Numbers directamente

En macOS y Linux, el comando file identifica formatos leyendo los magic numbers, no el nombre del archivo:

# macOS / Linux
$ file -b photo.png
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced

$ file -b photo.txt       # extensión cambiada a .txt
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced

file es una herramienta integrada en macOS y Linux. Windows no tiene un equivalente nativo.

Si necesitas implementar la misma detección en código, la lógica central son solo unas pocas líneas de JavaScript:

// Leer los primeros 18 bytes de una cadena Base64 para detección de formato
// (cada 4 caracteres Base64 = 3 bytes)
const b64 = "iVBORw0KGgoAAAANSUhEUgAA...";
const bin = atob(b64.slice(0, 24));
const hex = [...bin]
  .map(c => c.charCodeAt(0).toString(16).padStart(2, "0"))
  .join(" ");
console.log(hex);
// → 89 50 4e 47 0d 0a 1a 0a ... (PNG)

Consulta la tabla: 89 50 4e 47 → PNG, ff d8 ff → JPEG, 25 50 44 46 → PDF.

Resumen

Los bytes mágicos son una evidencia fuerte del formato binario, pero no un sistema universal de tipos. Ten en cuenta la firma, el MIME declarado, los metadatos del contenedor y las reglas de la herramienta que lo consume.

Cambiar el nombre no cambia los bytes, por lo que los detectores basados en contenido pueden reconocer el formato original; las asociaciones basadas en el nombre pueden comportarse de otra forma.

Artículo relacionado

Cómo depurar imágenes Base64 en respuestas JSON de API →

ViewJSON aplica detección de magic numbers a cada cadena en tu JSON: las imágenes, audio y vídeo Base64 se previsual izan como vistas previas inline automáticamente.

Pruébalo ahora

Pega cualquier JSON con contenido Base64 — ViewJSON detecta automáticamente el formato y muestra imágenes, audio y vídeo inline. Sin decodificación manual.

Abrir ViewJSON →