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

StackOverflow https://stackoverflow.com/questions/2147484

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

file <file_name>

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

/usr/share/file/magic

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

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

Прочитай это: http://linux.die.net/man/5/magic

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

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

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

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

В приведенном ниже примере используется база данных Magic по умолчанию для запроса файла, переданного в командной строке.(По сути, это реализация файл команда.Видеть человек, 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;
    }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top