¿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) |
| 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:
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:
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 →