O que é um Magic Number de arquivo? Detecção de formato explicada
Publicado em 24 de abril de 2026 · 6 min de leitura
Como o sistema operacional sabe o que é um arquivo?
Renomeie um PNG para .txt. O Quick Look do macOS ainda exibe como imagem. Execute file renamed.txt no Linux — a saída continua sendo PNG image data. O nome mudou, mas o formato não. Por quê?
Porque os sistemas operacionais nunca usam o nome do arquivo para identificar formatos. Eles leem uma sequência fixa de bytes no início do arquivo — chamada de magic number (também conhecida como assinatura de arquivo ou cabeçalho de arquivo).
O Explorador de Arquivos do Windows, o Finder do macOS, o MIME sniffing do navegador — todos usam a mesma abordagem: ler os primeiros bytes, comparar com assinaturas conhecidas e tirar uma conclusão.
O que é um Magic Number?
Cada formato de arquivo reserva uma sequência fixa de bytes no início do arquivo para declarar seu tipo. Esses bytes são chamados de magic numbers (também conhecidos como assinaturas de arquivo ou cabeçalhos de arquivo).
Pense em um passaporte: o controle de fronteira não pergunta seu nome — abre a primeira página e confirma sua nacionalidade. Um magic number é a «primeira página» de um arquivo. Não importa o nome, os primeiros bytes revelam a verdade.
É exatamente assim que o comando file do Unix funciona: ele mantém um banco de dados magic de padrões de bytes e os compara — sem depender de extensões. O Explorador do Windows, o Finder do macOS e o MIME sniffing do navegador funcionam da mesma forma. O tipo de arquivo é determinado pelo conteúdo, não pelo nome.
Tabela de referência rápida de Magic Numbers
Assinaturas de formato comuns que você encontrará na prática:
| Formato | Magic Bytes (Hex) | ASCII | Notas |
|---|---|---|---|
| PNG | 89 50 4E 47 0D 0A 1A 0A | ‰PNG.... | 8 bytes, uma das assinaturas mais reconhecíveis |
| JPEG | FF D8 FF | — | 3 bytes; o 3º varia conforme o subtipo |
| GIF | 47 49 46 38 | GIF8 | Seguido de 37 (GIF87a) ou 39 (GIF89a) |
| 25 50 44 46 | %PDF | Seguido da versão, ex.: -1.7 | |
| WebP | 52 49 46 46 … 57 45 42 50 | RIFF…WEBP | Contêiner RIFF; verificar bytes 8–11 |
| WAV | 52 49 46 46 … 57 41 56 45 | RIFF…WAVE | Contêiner RIFF; subtipo é WAVE |
| MP3 | 49 44 33 / FF Fx | ID3 / sync | Com tag ID3: começa com ID3; sem tag: palavra de sincronização FF Ex ou FF Fx |
| FLAC | 66 4C 61 43 | fLaC | Áudio sem perda, assinatura inequívoca |
| MP4 / MOV / M4A | 00 00 00 xx 66 74 79 70 | ....ftyp | Contêiner ftyp; verificar a marca nos bytes 8–11 |
| WebM | 1A 45 DF A3 | — | Cabeçalho de contêiner EBML |
| OGG | 4F 67 67 53 | OggS | Contêiner de áudio/vídeo OGG |
| BMP | 42 4D | BM | Bitmap do Windows |
A armadilha: quatro bytes nem sempre são suficientes
Duas famílias de contêineres compartilham prefixos comuns em tipos de mídia completamente diferentes. Parar no byte 4 dará o resultado errado.
Contêiner RIFF (WebP / WAV / AVI)
WebP, WAV e AVI começam com RIFF (52 49 46 46). O subtipo real está nos bytes 8–11:
Contêiner ftyp (MP4 / MOV / M4A)
MP4, MOV e M4A começam com um tamanho de caixa variável de 4 bytes, depois ftyp nos bytes 4–7. O código de marca nos bytes 8–11 determina o formato real:
Códigos de marca importantes: isom / iso2 / avc1 = MP4, M4A = M4A (áudio Apple), qt = QuickTime MOV.
Teste: o comando file lê Magic Numbers diretamente
No macOS e Linux, o comando file identifica formatos lendo os magic numbers — não o nome do arquivo:
# macOS / Linux
$ file -b photo.png
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced
$ file -b photo.txt # extensão alterada para .txt
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced file é uma ferramenta integrada do macOS e Linux. O Windows não tem equivalente nativo.
Se precisar implementar a mesma detecção em código, a lógica central são poucas linhas de JavaScript:
// Ler os primeiros 18 bytes de uma string Base64 para detecção 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) Consulte a tabela: 89 50 4e 47 → PNG, ff d8 ff → JPEG, 25 50 44 46 → PDF.
Resumo
O tipo de arquivo é determinado pelos bytes mágicos no início do conteúdo binário — não pelo nome ou extensão. Leia os primeiros bytes, compare com assinaturas conhecidas e você pode identificar qualquer formato sem contexto adicional.
É por isso que renomear um arquivo não engana o sistema operacional — nem qualquer ferramenta que lê magic numbers.
Artigo relacionado
Como depurar imagens Base64 em respostas JSON de API →ViewJSON aplica detecção de magic numbers a cada string no seu JSON — imagens, áudio e vídeo Base64 são exibidos automaticamente como prévia inline.
Teste agora
Cole qualquer JSON com conteúdo Base64 — o ViewJSON detecta automaticamente o formato e exibe imagens, áudio e vídeo inline. Sem decodificação manual.
Abrir ViewJSON →