Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何获取二进制文件的幻数_Unix_File Type_Magic Numbers - Fatal编程技术网

Unix 如何获取二进制文件的幻数

Unix 如何获取二进制文件的幻数,unix,file-type,magic-numbers,Unix,File Type,Magic Numbers,每个二进制文件都有一个幻数,有人知道如何从该文件中检索此信息吗?unix文件命令使用幻数。有关更多信息,请参阅。(以及在哪里可以找到魔法文件)阅读以下内容: 它很复杂,取决于您要查找的特定文件类型 file <file_name> 另外,请检查此链接,有人试图使用libmagic在C程序中获取信息,如果您自己编写一些东西,这可能会很有用。有一个命令,它反过来使用一个魔术库,魔术库从/etc中找到的名为magic的文件中读取(这取决于安装情况,可能会有所不同),详细说明文件的前几个字

每个二进制文件都有一个幻数,有人知道如何从该文件中检索此信息吗?

unix文件命令使用幻数。有关更多信息,请参阅。(以及在哪里可以找到魔法文件)

阅读以下内容:

它很复杂,取决于您要查找的特定文件类型

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;
    }

}