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