Il existe un numéro magique associé à chaque fichier binaire, est-ce que quelqu'un sait comment récupérer ces informations du fichier? p>
6 Réponses :
La commande Unix File utilise un numéro magique. Voir le Page man pour plus. (Et où trouver le fichier magique) < / p>
/usr/share/file/magic
Il y a un Fichier Commande qui utilise à son tour une bibliothèque magique, la magie La bibliothèque se lit à partir d'un fichier trouvé dans / etc appelé J'espère que cela aide,
Meilleures salutations,
Tom. P> magie code> (il s'agit d'une installation dépendante et peut varier), qui détaillent quels sont les premiers octets du fichier et indique le fichier
code> Quel type de fichier c'est, que ce soit, jpg, binaire, texte, script shell. Il y a une ancienne version de Libmagic trouvé sur Sourceforge. Incidemment, il existe une réponse connexe à ce ici . p>
Utilisez libmagic à partir du fichier pour essayer de renifler le type de fichier si c'est votre objectif. P>
Il n'y a pas de chiffres généraux "magiques" dans des fichiers binaires sur UNIX, bien que différents formats puissent définir leur propre. La bibliothèque ci-dessus connaît beaucoup de ceux-ci et utilise également diverses autres heuristiques pour essayer de déterminer le format / type de fichier. P>
Mise à jour: sur les systèmes Ubuntu actuels, le nom du paquet est libmagic-dev i>
Expliquer sur la réponse @ NOS:
L'exemple ci-dessous utilise la base de données magique par défaut pour interroger le fichier transmis sur la ligne de commande. (Essentiellement une implémentation de la commande fichier em>. Voir Man Libmagic em> pour plus de détails / fonctions. P> #include <iostream>
#include <magic.h>
#include <cassert>
int main(int argc, char **argv) {
if (argc == 1) {
std::cerr << "Usage " << argv[0] << " [filename]" << std::endl;
return -1;
}
const char * fname = argv[1];
magic_t cookie = magic_open(0);
assert (cookie !=nullptr);
int rc = magic_load(cookie, nullptr);
assert(rc == 0);
auto f= magic_file(cookie, fname);
if (f ==nullptr) {
std::cerr << magic_error(cookie) << std::endl;
} else {
std::cout << fname << ' ' << f << std::endl;
}
}
Si vous souhaitez écrire un logiciel pour prendre en charge plusieurs formats de fichiers, vérifiez simplement le numéro magique de chaque format à son tour jusqu'à ce que l'un d'entre eux correspond. Si vous êtes simplement curieux, utilisez la commande
fichier code> ci-dessous et rappelez-vous qu'il n'est ni complet ni bulletproof, il n'y a pas de norme pour ce truc.