我有一个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'
文件中有文件,如下图所示。
程序在文件头中找不到这种模式(r'\ x47 \ x40 \ x00')。
所以,我试图打印标题:
你知道吗? Python认为它是'G @'而不是'\ x47 \ x40'如果我在标题中搜索'G @'+ r'\ x00' - 一切正常。它找到了它。
问题:我做错了什么?我想寻找r'\x47\x40\x00'
并找到它。不是为了一些奇怪的'G @'+ r'\ x00'。
OR
为什么python将前两个数字视为'G @'而不是'\ x47 \ x40',尽管它在HEX中看到了其余的标题?有办法解决吗?
答案 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
直接在字节数组中搜索字节数组,因此请将它们转换为包含固定长度十六进制表示形式的字符串作为子字符串,如图所示。