【发布时间】:2011-01-09 23:42:56
【问题描述】:
每个二进制文件都有一个魔术数字,有谁知道如何从文件中检索这个信息?
【问题讨论】:
-
如果你想编写软件来支持多种文件格式,只需依次检查每种格式的幻数,直到其中一种匹配。如果您只是好奇,请使用下面的
file命令并记住它既不全面也不防弹——这些东西没有标准。
标签: unix file-type magic-numbers
每个二进制文件都有一个魔术数字,有谁知道如何从文件中检索这个信息?
【问题讨论】:
file 命令并记住它既不全面也不防弹——这些东西没有标准。
标签: unix file-type magic-numbers
file <file_name>
幻数通常存储在(linux)中:
/usr/share/file/magic
也检查这个链接,有人试图使用 libmagic 来获取 C 程序中的信息,如果你自己写一些东西可能会很有用。
【讨论】:
unix 文件命令使用幻数。请参阅file man page 了解更多信息。(以及在哪里可以找到魔法文件)
【讨论】:
阅读:http://linux.die.net/man/5/magic
这很复杂,取决于您要查找的特定文件类型。
【讨论】:
阐述@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;
}
}
【讨论】: