hex文件头,魔术数字,python

时间:2017-01-29 12:06:52

标签: python file python-3.x header hex

我有一个Python程序,它分析文件头并决定它是哪种文件类型。 (https://github.com/LeoGSA/Browser-Cache-Grabber

问题如下: 我读了一个文件的前24个字节:

with open (from_folder+"/"+i, "rb") as myfile:
    header=str(myfile.read(24))

然后我在其中寻找模式:

if y[1] in header:
    shutil.move (from_folder+"/"+i,to_folder+y[2]+i+y[3])

其中y = ['/video', r'\x47\x40\x00', '/video/', '.ts']

y[1]是模式,而= r'\x47\x40\x00'

文件中有文件,如下图所示。

enter image description here

程序在文件头中找不到这种模式(r'\ x47 \ x40 \ x00')。

所以,我试图打印标题:

enter image description here

你知道吗? Python认为它是'G @'而不是'\ x47 \ x40'

如果我在标题中搜索'G @'+ r'\ x00' - 一切正常。它找到了它。

问题:我做错了什么?我想寻找r'\x47\x40\x00'并找到它。不是为了一些奇怪的'G @'+ r'\ x00'。

OR

为什么python将前两个数字视为'G @'而不是'\ x47 \ x40',尽管它在HEX中看到了其余的标题?有办法解决吗?

2 个答案:

答案 0 :(得分:1)

    with open (from_folder+"/"+i, "rb") as myfile:
        header=myfile.read(24)
        header = str(binascii.hexlify(header))[2:-1]

我得到的结果是: 我可以使用它

4740001b0000b00d0001c100000001efff3690e23dffffff

P.S。但无论如何,如果有人会用2个第一个字节来解释问题是什么 - 我将不胜感激。

答案 1 :(得分:1)

在Python 3中,您将从二进制读取中获取字节,而不是字符串。 无需通过str将其转换为字符串。 打印将尝试将字节转换为人类可读的内容。 如果您不想要,请将您的字节转换为例如十进制字节整数值的十六进制表示:

b'\x00G@\x00\x13\x00\x00\xb0'
0x00x470x400x00x130x00x00xb0

从控制台重定向输出:

aBytes

您无法使用in运算符直接在aBytes中进行搜索,因为aBytes = b'\x00\x47\x40\x00\x13\x00\x00\xb0' print (aBytes) print (r'\x'.join ([''] + ['%0.2x'%aByte for aByte in aBytes])) 不是字符串,而是字节数组。

如果您想在' \ x00 \ x47 \ x40'上应用字符串搜索,请使用:

b'\x00G@\x00\x13\x00\x00\xb0'
\x00\x47\x40\x00\x13\x00\x00\xb0

哪个会给你:

print

因此,这里有许多不同的问题:

  • in尝试打印人类可读的内容,仅对前两个字符成功。

  • 您无法使用spring.datasource.url = jdbc:mysql://localhost:3306/yourdatabase # Username and password spring.datasource.username = root spring.datasource.password = # Show or not log for each sql query spring.jpa.show-sql = true spring.jpa.hibernate.ddl-auto = create # Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy # Allows Hibernate to generate SQL optimized for a particular DBMS spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 直接在字节数组中搜索字节数组,因此请将它们转换为包含固定长度十六进制表示形式的字符串作为子字符串,如图所示。