Blog

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)
PDF 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:

+0
RIFF
prefixo compartilhado
+4
tamanho do arquivo (4 bytes)
+8
subtipo WEBP / WAVE / AVI
formato real aqui
+12
dados de chunk

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:

+0
tamanho da caixa (variável)
+4
ftyp
marcador fixo
+8
marca isom / M4A / qt
formato real aqui
+12
lista de compatibilidade

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 →