Unix 如何获取二进制文件的幻数
每个二进制文件都有一个幻数,有人知道如何从该文件中检索此信息吗?unix文件命令使用幻数。有关更多信息,请参阅。(以及在哪里可以找到魔法文件)阅读以下内容: 它很复杂,取决于您要查找的特定文件类型Unix 如何获取二进制文件的幻数,unix,file-type,magic-numbers,Unix,File Type,Magic Numbers,每个二进制文件都有一个幻数,有人知道如何从该文件中检索此信息吗?unix文件命令使用幻数。有关更多信息,请参阅。(以及在哪里可以找到魔法文件)阅读以下内容: 它很复杂,取决于您要查找的特定文件类型 file <file_name> 另外,请检查此链接,有人试图使用libmagic在C程序中获取信息,如果您自己编写一些东西,这可能会很有用。有一个命令,它反过来使用一个魔术库,魔术库从/etc中找到的名为magic的文件中读取(这取决于安装情况,可能会有所不同),详细说明文件的前几个字
file <file_name>
另外,请检查此链接,有人试图使用libmagic在C程序中获取信息,如果您自己编写一些东西,这可能会很有用。有一个命令,它反过来使用一个魔术库,魔术库从/etc中找到的名为magic
的文件中读取(这取决于安装情况,可能会有所不同),详细说明文件的前几个字节是什么,并告诉文件
它是什么类型的文件,可以是jpg、二进制、文本、shell脚本。sourceforge上有一个旧版本的libmagic。顺便说一句,这有一个相关的答案
希望这有帮助,
顺致敬意,
Tom。如果这是您的目标,请从软件包中使用,尝试找出文件类型
unix上的二进制文件中没有通用的“魔法”数字,尽管不同的格式可能会定义它们自己的数字。上面的库了解其中的许多内容,并且还使用各种其他启发式方法尝试找出文件的格式/类型。阐述@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;
}
}
#包括
#包括
#包括
int main(int argc,字符**argv){
如果(argc==1){
如果你想编写支持多种文件格式的软件,只需依次检查每种格式的神奇数字,直到其中一种匹配。如果你只是好奇,请使用下面的file
命令,记住它既不全面也不防弹——这方面没有标准。更新:在当前的Ubuntu上系统包名为libmagic dev
#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;
}
}