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 los sistemas operativos nunca se basan en el nombre del archivo para identificar formatos. Leen una secuencia fija de bytes al inicio del archivo, llamada magic number (también conocido como firma de archivo o cabecera de archivo).

El Explorador de Windows, Finder de macOS, el MIME sniffing del navegador — todos usan el mismo enfoque: leer los primeros bytes, compararlos con firmas conocidas y sacar una conclusión.

¿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 exactamente el comando file de Unix: mantiene una base de datos magic de patrones de bytes y los compara, sin depender de extensiones. El Explorador de Windows, Finder de macOS y el MIME sniffing del navegador funcionan igual. El tipo de archivo lo determina el contenido, no el nombre.

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

El tipo de archivo está determinado por los bytes mágicos al inicio del contenido binario, no por el nombre ni la extensión. Lee los primeros bytes, compáralos con firmas conocidas y podrás identificar cualquier formato sin contexto adicional.

Por eso renombrar un archivo no engaña al sistema operativo ni a ninguna herramienta que lea magic numbers.

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 →