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

时间:2019-04-09 07:18:41

标签: python file byte

我遇到一个问题:

  

我们提取了一个外星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")

很明显,我做错了什么,但我不知道是什么。循环有问题吗?我应该如何使用魔术字节来识别文件?

1 个答案:

答案 0 :(得分:0)

您的代码需要稍作调整,在单词Inventory Allocation = VAR TotalInventory = LOOKUPVALUE ( Inventory[Qty On Hand], Inventory[Item], 'Open Orders'[Item] ) VAR CurrItem = 'Open Orders'[Item] VAR CurrDate = 'Open Orders'[Due Date] VAR AlreadyOrdered = CALCULATE ( SUM ( 'Open Orders'[Qty Open] ), REMOVEFILTERS ( 'Open Orders' ), Inventory[Item] = CurrItem, 'Open Orders'[Due Date] < CurrDate ) RETURN IF ( AlreadyOrdered > TotalInventory, 0, MIN ( 'Open Orders'[Qty Open], TotalInventory - AlreadyOrdered ) ) 前面加一个点,就好像文件具有扩展名一样。另外,打印png。 (CS_Game挑战?)。运行此:

file_head

它应打印如下内容:

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()
            print(file_head)

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

您的旗帜可能与我的不同。

干杯!