Как получить магический номер двоичного файла
-
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;
}
}