每个二进制文件都有一个幻数,是否有人知道如何从文件中检索此信息?
答案 0 :(得分:8)
file <file_name>
幻数通常存储在(linux)中:
/usr/share/file/magic
还要查看此链接,有人试图使用libmagic来获取C程序中的信息,如果您自己写一些内容可能会有用。
答案 1 :(得分:6)
如果这是您的目标,请使用libmagic包中的file来尝试嗅出文件类型。
unix上的二进制文件中没有通用的“魔术”数字,但不同的格式可能会定义自己的。上面的库知道其中的许多,并使用各种其他启发式方法来尝试找出文件的格式/类型。
答案 2 :(得分:1)
unix file命令使用幻数。请参阅file man page了解更多信息。(以及查找魔术文件的位置)
答案 3 :(得分:1)
阅读本文:http://linux.die.net/man/5/magic
它很复杂,取决于您要查找的特定文件类型。
答案 4 :(得分:1)
有一个file命令反过来使用一个魔术库,魔术库从/ etc中找到的文件中读取magic
(这取决于安装,可能会有所不同),详细说明了是文件的前几个字节,并告诉file
它是什么类型的文件,是它,jpg,二进制文本,文本,shell脚本。在sourceforge上找到了一个旧版本的libmagic。顺便提一下,这个here有一个相关的答案。
希望这有帮助, 最好的祝福, 汤姆。
答案 5 :(得分:0)
@nos答案的解释:
下面的示例使用默认的magic数据库查询在命令行上传递的文件。 (本质上是 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;
}
}