[英]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.