【问题标题】:How to get magic number of a binary file如何获取二进制文件的幻数
【发布时间】:2011-01-09 23:42:56
【问题描述】:

每个二进制文件都有一个魔术数字,有谁知道如何从文件中检索这个信息?

【问题讨论】:

  • 如果你想编写软件来支持多种文件格式,只需依次检查每种格式的幻数,直到其中一种匹配。如果您只是好奇,请使用下面的file 命令并记住它既不全面也不防弹——这些东西没有标准。

标签: unix file-type magic-numbers


【解决方案1】:
file <file_name>

幻数通常存储在(linux)中:

/usr/share/file/magic

也检查这个链接,有人试图使用 libmagic 来获取 C 程序中的信息,如果你自己写一些东西可能会很有用。

【讨论】:

    【解决方案2】:

    如果这是您的目标,请使用 file 包中的 libmagic 尝试找出文件类型。

    在 unix 上的二进制文件中没有通用的“神奇”数字,尽管不同的格式可能会定义自己的数字。上面的库知道其中的许多,并且还使用各种其他启发式方法来尝试找出文件的格式/类型。

    【讨论】:

    • 更新:在当前的 Ubuntu 系统上,包名是 libmagic-dev
    【解决方案3】:

    unix 文件命令使用幻数。请参阅file man page 了解更多信息。(以及在哪里可以找到魔法文件)

    【讨论】:

      【解决方案4】:

      阅读:http://linux.die.net/man/5/magic

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

      【讨论】:

        【解决方案5】:

        有一个file 命令又使用一个魔法库,魔法库从 /etc 中的一个名为 magic 的文件中读取(这取决于安装,可能会有所不同),其中详细说明了前几个文件的字节并告诉file 它是什么类型的文件,无论是jpg、二进制文件、文本还是shell 脚本。在 sourceforge 上有一个旧版本的 libmagic。顺便说一句,这个here有一个相关的答案。

        希望这会有所帮助, 最好的祝福, 汤姆。

        【讨论】:

          【解决方案6】:

          阐述@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;
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-19
            • 2013-01-01
            • 2012-03-19
            • 1970-01-01
            • 2019-04-10
            相关资源
            最近更新 更多