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 muitos detectores de formato inspecionam bytes do conteúdo — um magic number ou assinatura — em vez de confiar apenas no nome do arquivo.
As extensões continuam influenciando a associação e a abertura dos arquivos. Ferramentas como <code>file</code> e alguns fluxos MIME também inspecionam bytes, mas não usam regras idênticas.
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.
O comando Unix file compara o conteúdo com um banco magic de padrões de bytes. Isso fornece evidência sobre o formato, mas não substitui o MIME, os metadados do contêiner nem as regras de cada ferramenta.
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
Bytes mágicos são uma evidência forte do formato binário, mas não um sistema universal de tipos. Considere a assinatura, o MIME declarado, os metadados do contêiner e as regras da ferramenta que consome o arquivo.
Renomear não altera os bytes, então detectores baseados no conteúdo ainda podem reconhecer o formato original; associações baseadas no nome podem se comportar de outra forma.
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 →