Blog

Qu'est-ce qu'un Magic Number de fichier ? Détection de format expliquée

Publié le 24 avril 2026 · 6 min de lecture

Comment l'OS sait-il ce qu'est un fichier ?

Renommez un PNG en .txt. Quick Look de macOS l'affiche toujours comme une image. Exécutez file renamed.txt sous Linux — la sortie indique toujours PNG image data. Le nom a changé, mais le format non. Pourquoi ?

Parce que les systèmes d'exploitation ne se fient jamais au nom du fichier pour identifier les formats. Ils lisent une séquence fixe d'octets au tout début du fichier — appelée magic number (ou signature de fichier).

L'Explorateur Windows, le Finder macOS, le MIME sniffing des navigateurs — tous utilisent la même approche : lire les premiers octets, comparer avec les signatures connues, tirer une conclusion.

Qu'est-ce qu'un Magic Number ?

Chaque format de fichier réserve une séquence fixe d'octets au début du fichier pour déclarer son type. Ceux-ci sont appelés magic numbers (aussi connus comme signatures de fichier ou en-têtes de fichier).

Pensez à un passeport : le contrôle aux frontières ne demande pas votre nom — il ouvre la première page et confirme votre nationalité. Un magic number est la « première page » d'un fichier. Quel que soit le nom, les premiers octets révèlent la vérité.

C'est exactement ainsi que fonctionne la commande file d'Unix : elle maintient une base de données magic de motifs d'octets et les compare — sans jamais se fier aux extensions. L'Explorateur Windows, le Finder macOS et le MIME sniffing des navigateurs fonctionnent de la même manière. Le type de fichier est déterminé par le contenu, pas par le nom.

Table de référence rapide des Magic Numbers

Signatures de format courantes que vous rencontrerez en pratique :

Format Magic Bytes (Hex) ASCII Notes
PNG 89 50 4E 47 0D 0A 1A 0A ‰PNG.... 8 octets, l'une des signatures les plus reconnaissables
JPEG FF D8 FF 3 octets ; le 3e varie selon le sous-type
GIF 47 49 46 38 GIF8 Suivi de 37 (GIF87a) ou 39 (GIF89a)
PDF 25 50 44 46 %PDF Suivi de la version, ex. -1.7
WebP 52 49 46 46 … 57 45 42 50 RIFF…WEBP Conteneur RIFF ; vérifier les octets 8–11
WAV 52 49 46 46 … 57 41 56 45 RIFF…WAVE Conteneur RIFF ; sous-type WAVE
MP3 49 44 33 / FF Fx ID3 / sync Avec tag ID3 : commence par ID3 ; sans tag : mot de synchronisation FF Ex ou FF Fx
FLAC 66 4C 61 43 fLaC Audio sans perte, signature non ambiguë
MP4 / MOV / M4A 00 00 00 xx 66 74 79 70 ....ftyp Conteneur ftyp ; vérifier la marque aux octets 8–11
WebM 1A 45 DF A3 En-tête de conteneur EBML
OGG 4F 67 67 53 OggS Conteneur audio/vidéo OGG
BMP 42 4D BM Bitmap Windows

Le piège : quatre octets ne suffisent pas toujours

Deux familles de conteneurs partagent des préfixes communs pour des types de médias complètement différents. S'arrêter à l'octet 4 donnera un résultat erroné.

Conteneur RIFF (WebP / WAV / AVI)

WebP, WAV et AVI commencent tous par RIFF (52 49 46 46). Le sous-type réel se trouve aux octets 8–11 :

+0
RIFF
préfixe commun
+4
taille du fichier (4 octets)
+8
sous-type WEBP / WAVE / AVI
format réel ici
+12
données de chunk

Conteneur ftyp (MP4 / MOV / M4A)

MP4, MOV et M4A commencent par une taille de boîte variable de 4 octets, puis ftyp aux octets 4–7. Le code de marque aux octets 8–11 détermine le format réel :

+0
taille de boîte (variable)
+4
ftyp
marqueur fixe
+8
marque isom / M4A / qt
format réel ici
+12
liste de compatibilité

Codes de marque à connaître : isom / iso2 / avc1 = MP4, M4A = M4A (audio Apple), qt = QuickTime MOV.

Essayez : la commande file lit les Magic Numbers directement

Sur macOS et Linux, la commande file identifie les formats en lisant les magic numbers — pas le nom du fichier :

# macOS / Linux
$ file -b photo.png
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced

$ file -b photo.txt       # extension changée en .txt
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced

file est un outil intégré à macOS et Linux. Windows n'a pas d'équivalent natif.

Si vous devez implémenter la même détection en code, la logique se résume à quelques lignes de JavaScript :

// Lire les 18 premiers octets d'une chaîne Base64 pour la détection de format
// (4 caractères Base64 = 3 octets)
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)

Consultez la table : 89 50 4e 47 → PNG, ff d8 ff → JPEG, 25 50 44 46 → PDF.

Résumé

Le type de fichier est déterminé par les octets magiques au début du contenu binaire — pas par le nom ni l'extension. Lisez les premiers octets, comparez avec les signatures connues, et vous pouvez identifier n'importe quel format sans contexte supplémentaire.

C'est pourquoi renommer un fichier ne trompe pas l'OS — ni aucun outil qui lit les magic numbers.

Article connexe

Comment déboguer les images Base64 dans les réponses JSON d'API →

ViewJSON applique la détection de magic numbers à chaque chaîne de votre JSON — les images, audio et vidéos Base64 s'affichent automatiquement en aperçu inline.

Essayez maintenant

Collez n'importe quel JSON contenant du Base64 — ViewJSON détecte automatiquement le format et affiche images, audio et vidéo inline. Pas de décodage manuel.

Ouvrir ViewJSON →