Déterminer le type d’un fichier dont on n’a pas le nom
Dans le projet sur lequel on bosse, on a une couche en Java qui appelle du code natif en C. Quand on télécharge une image, on récupère au final un buffer que l'on va faire passer à la couche C pour décompression/conversion bien comme il faut pour notre eBook.
Seulement voilà, la fonction générique ne prend qu'un buffer et sa taille comme argument, du coup le hack qui avait été mis en place était de dire que par défaut c'est un PNG, et puis si jamais libpng se chie dessus, on teste autre chose. Bon, un peu crado, et pas super efficace.
En fait il est possible de déterminer si c'est un PNG ou un JPG assez facilement, puisque ceux-ci ont toujours les mêmes entêtes... En regardant les 4 ou 8 premiers octets, on sait donc à quoi on a affaire. Simple, et efficace. Comme j'avais la flemme je me suis basé uniquement sur les 4 premiers, et du coup voilà ce que je recherche :
Pour trouver ce genre d'infos, vous avez plusieurs solutions. La première est bien entendue d'afficher les premiers octets du fichier (ou de l'ouvrir dans un éditeur type bloc-note), mais la seconde est de faire ça proprement et d'aller voir sur http://www.wotsit.org/ pour obtenir de vraies informations officielles sur les formats de fichier, le stockage des données à l'intérieur, etc.
Aucun trackbacks pour l'instant
26 août 2010
Le bon vieux « magic number » présent au début de chaque fichier.
Y’a un article là dessus : http://en.wikipedia.org/wiki/Magic_number_(programming)
28 août 2010
Merci pour le lien, je note
27 août 2010
Ah qu’on est chanceux, sous linux: on a un zoli fichier /usr/share/misc/magic.mgc, la « définition source » et la lib qui va avec pour déterminer ça (et extraire le type mime, par exemple) … et même un outil sympa en ligne de commande.
Il doit sûrement y avoir une version « cygwin » de ça aussi … c’est pour embarquer ? ah. il faudra peut-être faire un peu le tri en fonction des besoins de ton appli, alors. Quand-même >1000 lignes, le brol.