Как получить магический номер двоичного файла - PullRequest
9 голосов
/ 27 января 2010

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

Ответы [ 6 ]

8 голосов
/ 27 января 2010
file <file_name>

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

/usr/share/file/magic

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

6 голосов
/ 27 января 2010

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

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

1 голос
/ 27 января 2010

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

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

1 голос
/ 27 января 2010

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

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

1 голос
/ 27 января 2010

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

0 голосов
/ 30 апреля 2019

Излагая ответ @ 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;
    }

}
...