如何使用头文件签名(幻数)检查文件类型?

2024-02-03

通过输入文件及其扩展名,我的代码成功地从“幻数”中检测到文件的类型。

magic_numbers = {'png': bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]),
                 'jpg': bytes([0xFF, 0xD8, 0xFF, 0xE0]),
                 #*********************#
                 'doc': bytes([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1]),
                 'xls': bytes([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1]),
                 'ppt': bytes([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1]),
                 #*********************#
                 'docx': bytes([0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00]),
                 'xlsx': bytes([0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00]),
                 'pptx': bytes([0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00]),
                 #*********************#
                 'pdf': bytes([0x25, 0x50, 0x44, 0x46]),
                 #*********************#
                 'dll': bytes([0x4D, 0x5A, 0x90, 0x00]),
                 'exe': bytes([0x4D, 0x5A]),

                 }

max_read_size = max(len(m) for m in magic_numbers.values()) 
 
with open('file.pdf', 'rb') as fd:
    file_head = fd.read(max_read_size)
 
if file_head.startswith(magic_numbers['pdf']):
    print("It's a PDF File")
else:
    print("It's not a PDF file")

我想知道如何在不指定这部分代码的情况下修改它,即一旦生成或输入文件,它就会直接显示文件的类型。

if file_head.startswith(magic_numbers['pdf']):
    print("It's a PDF File")
else:
    print("It's not a PDF file")

我希望你能理解我。


您最喜欢的只是想迭代循环并测试所有这些。

您也可以使用该扩展来优化或提供一些错误检查。如果您去掉扩展名并首先检查,大多数情况下您都会成功,否则您可能不想接受“baby.png”作为 xlsx 文件。这将是可疑的并且值得犯错误。

但是,如果您忽略扩展,只需循环遍历条目:

for ext in magic_numbers:
    if file_head.startswith(magic_numbers[ext]):
        print("It's a {} File".format(ext))

您可能想将其放入返回类型的函数中,这样您就可以只返回类型而不是将其打印出来。

编辑 由于有些共享幻数,我们需要假设扩展是正确的,直到我们知道它不正确。我将从文件名中提取扩展名。这可以用以下方法完成Pathlib或者只是字符串分割:

ext = filename.rsplit('.', 1)[-1]

然后具体测试一下

if ext in magic_numbers:
    if file_head.startswith(magic_numbers[ext]):
        return ext

首先进行 ext 测试,所以将它们放在一起:

ext = filename.rsplit('.', 1)[-1]
if ext in magic_numbers:
    if file_head.startswith(magic_numbers[ext]):
        return ext

for ext in magic_numbers:
    if file_head.startswith(magic_numbers[ext]):
        return ext

return nil
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用头文件签名(幻数)检查文件类型? 的相关文章

随机推荐

  • 使用 xml.Load 打开 HTML 文档

    我想打开一个 HTML 文档 作为从 Web 上的 StreamReader 检索的字符串 通过这样创建 XMLDocument XmlDocument doc new XmlDocument doc Load string contain
  • 添加到 OSX 上的类路径

    谁能告诉我如何添加到 OSX 上的类路径 如果您想让计算机上的每个 Java 应用程序都可以使用一组特定的 JAR 文件 或 class 文件 那么最好的选择是将这些文件添加到 Library Java Extensions 或者 如果您想
  • 如何使用 Guava 将 MultiMap 转换为 Map>?

    我正在使用 Google Guava 12 中的 MultiMap 如下所示 Multimap
  • getSherlockActivity() 与 getActivity()

    我正在使用 SherlockFragment 直到今天我一直使用 getActivity 方法来获取托管片段的活动的实例 现在我意识到 SherlockFragment API 中也有这个方法 我应该使用哪一个 好像getSherlockA
  • Arduino Python3 脚本

    我正在尝试使用 Python3 脚本来控制 Arduino Mega 这是一个简单的脚本 用于从键盘获取一行并通过 Arduino 回显它 我从一个可用的 Python 2 脚本开始http petrimaki wordpress com
  • 在 axios 中检测 xhr.status === 0

    Context 我有一个在企业环境中运行的网络应用程序 其中所有请求都通过我无法控制的代理 该层会根据需要自动将我的用户重定向到不同域上的单点登录页面 这是基本顺序 用户类型myapp example corp进入他们的浏览器 请求通过代理
  • NHibernate - ITransaction.Commit 真的有必要吗?

    我两天前刚刚开始学习NHibernate 我正在寻找一个我根据教程编写的CRUD方法 我的插入方法是 using ISession session Contexto OpenSession using ITransaction transa
  • 开发黑莓应用程序的好工具包是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 寻找用于一般 Blackberry 开发或应用程序工具包的工具包 SDK 有类似 MVC 框架的东西吗
  • 删除一个表中未被另一个表引用的所有记录

    2张桌子 项目 编号 用户 id item id 怎么删除里面的所有记录items未引用自users 请注意 NOT IN 可能会非常慢 有时 令人惊讶的是 这样做会更快 DELETE FROM items WHERE id IN SELE
  • 线程安全与同步

    我是java新手 我对线程安全和同步有点困惑 线程安全意味着一个方法或类实例可以被多个线程同时使用而不会出现任何问题 其中 同步意味着单个时间只能有一个线程运行 那么它们之间有何关系呢 线程安全的定义在Java 并发实践 http amzn
  • Angular2 局部模板变量

    在下面的例子中 我指定了一个局部变量 input多个单选按钮 当点击 tr 我想选择里面的单选按钮 下面的代码工作正常 但我不明白为什么 当所有输入都具有局部变量时 Angular2 如何 知道 我指的是哪个输入 input HTML tr
  • Realm gradle 任务

    在我的个人资料报告期间assembleDebuggradle 任务 我发现了两个与领域相关的 gradle 子任务 这需要相当多的时间 assembleDebug 1m21 44s transformClassesWithRealmOpti
  • 从给定的 n 个点中选择最远的 k 个点

    我有一套Sn维度中的点d如果需要的话 我可以计算所有成对距离 我需要选择k该集合中的点 使得它们的成对距离之和最大 换句话说 我想要 S 中的 p1 pk 使得 sum i j 我知道这个问题与this one https stackove
  • 从Java中的IAM用户名获取Amazon访问密钥和秘密密钥

    我碰到从 Java 中的 Amazon Access Key 获取用户名 https stackoverflow com questions 13595541 get username from amazon access key in j
  • 检查 PyObject 是否为 None

    我只是想检查一下是否PyObject我有的是None 我天真地以为任何None Pyobject 从函数返回的将是 NULL 指针 但情况似乎并非如此 那么 我如何检查是否PyObject 我的指向一个None object 我知道有类似的
  • 如何在 R 中抓取网页而不出现空网站问题?

    我需要提取有关物种的信息 并编写以下代码 然而 我对一些缺失的物种有疑问 如何才能避免这个问题呢 Q lt c rvest stringr tidyverse jsonlite lapply Q require character only
  • 在 Ubuntu 上通过 pyODBC 连接到 Microsoft SQL Server

    连接到 Microsoft SQL Server 实例时遇到问题pyODBC在一个Ubuntu 12 10 机器 我返回的错误是 pyodbc Error IM002 IM002 unixODBC Driver Manager Data S
  • Winforms DataBind 到控件的 Visible 属性

    将数据绑定到控件的可见属性时是否存在任何已知问题 无论我的属性是什么 该控件始终不可见 Public ReadOnly Property IsRibbonCategory As Boolean Get Return True End Get
  • 从 Azure DevOps 导出测试结果

    我可能遗漏了一些东西 但找不到从 Azure DevOps 中项目的构建管道执行页面导出测试运行结果的方法 有一个 下载日志 当然 从技术上讲 您可以在其中找到来自测试执行步骤的日志以及其他内容 但这似乎不是定期获取此类数据以进行法规 审计
  • 如何使用头文件签名(幻数)检查文件类型?

    通过输入文件及其扩展名 我的代码成功地从 幻数 中检测到文件的类型 magic numbers png bytes 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A jpg bytes 0xFF 0xD8 0x