Как получить магический номер двоичного файла

С каждым двоичным файлом связан магический номер. Кто-нибудь знает, как извлечь эту информацию из файла?

5 ответов

Решение

Используйте libmagic из файлового пакета, чтобы попытаться определить тип файла, если это ваша цель.

В unix нет общих "магических" чисел в двоичных файлах, хотя разные форматы могут определять свои собственные. Приведенная выше библиотека знает о многих из них, а также использует различные другие эвристические методы, чтобы попытаться выяснить формат / тип файла.

file <file_name>

магические числа обычно хранятся в (linux):

/usr/share/file/magic

Также проверьте эту ссылку, кто-то пытался использовать libmagic для получения информации в программе на Си, может быть полезно, если вы пишете что-то самостоятельно.

Читать это: http://linux.die.net/man/5/magic

Это сложно и зависит от того, какой тип файла вы ищете.

Команда unix file использует магический номер. см. справочную страницу файла для получения дополнительной информации (и где найти волшебный файл)

Есть файловая команда, которая в свою очередь использует волшебную библиотеку, волшебная библиотека читает из файла, найденного в /etc, и называется magic (это зависит от установки и может варьироваться), в котором подробно описываются первые несколько байтов файла и указывается file что это за файл, будь то JPG, двоичный файл, текст, сценарий оболочки. На sourceforge найдена старая версия libmagic. Кстати, здесь есть соответствующий ответ.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Разъяснение ответа @nos:

В приведенном ниже примере используется волшебная база данных по умолчанию для запроса файла, переданного в командной строке. (По сути, реализация команды file. Более подробную информацию о функциях смотрите в man libmagic.

#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;
    }

}
Другие вопросы по тегам