繁体   English   中英

如何使用魔术字节来识别使用 python 的文件

[英]How to use magic bytes to identify files using python

我遇到了一个问题:

我们提取了一个外星 zip 文件,它是一堆 PNG 文件,但我们认为其中只有一个是有效的。 使用魔术字节来确定它是哪个。 提示:查找并阅读正确的文件以获取标志。

所有 png 文件都存储在 /tmp 目录中。 在对这个问题进行了几次尝试之后,我才到此为止。 我的代码运行良好,但根据我的代码,每个文件都no打印出正确的文件。

到目前为止,这是我的代码:

import glob,os

magic_numbers = {'.png': bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])}
max_read_size = max(len(m) for m in magic_numbers.values()) # get max size of magic numbers of the dict
os.chdir("/tmp")
for x in glob.glob("*.png"):
    with open(x, 'rb') as fd:
            file_head = fd.read(max_read_size)

    if file_head.startswith(magic_numbers['.png']):
            print("It's a PNG File")
    else:
            print("no")

显然我做错了什么,但我无法弄清楚它是什么。 是不是循环有问题? 我应该如何使用魔术字节来识别文件?

给我一个问题,指出:

我们提取了一个外星zip文件,它是一堆PNG文件,但我们认为其中只有一个是有效的。 使用魔术字节来确定它是哪个。 提示:查找并读取正确的文件以获取该标志。

所有png文件都存储在/ tmp目录中。 经过几次尝试解决这个问题,我到现在为止都还没到。 我的代码运行正常,但打印no与他们都不是根据我的代码正确的每一个文件。

到目前为止,这是我的代码:

import glob,os

magic_numbers = {'.png': bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])}
max_read_size = max(len(m) for m in magic_numbers.values()) # get max size of magic numbers of the dict
os.chdir("/tmp")
for x in glob.glob("*.png"):
    with open(x, 'rb') as fd:
            file_head = fd.read(max_read_size)

    if file_head.startswith(magic_numbers['.png']):
            print("It's a PNG File")
    else:
            print("no")

显然我做错了什么,但我无法弄清楚是什么。 循环有问题吗? 我应该如何使用魔术字节来识别文件?

你可以使用python-magic库。

python-magic 是 libmagic 文件类型识别库的 Python 接口。 libmagic 通过根据预定义的文件类型列表检查文件头来识别文件类型。(来自 pypi)

这个库检查幻数来识别文件类型。

import magic
print(magic.from_file('file.png'))

输出是:

'PNG image data, 2480 x 3437, 8-bit/color RGB, non-interlaced'

玩得开心!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM