python:二进制文件的正则表达式搜索模式(半字节)
我使用以下正则表达式模式在二进制文件中搜索0xDEAD4FAD:python:二进制文件的正则表达式搜索模式(半字节),python,regex,binaryfiles,Python,Regex,Binaryfiles,我使用以下正则表达式模式在二进制文件中搜索0xDEAD4FAD: my_pattern = re.compile(b"\xDE\xAD\x4F\xAD") 但是我如何推广搜索0xDEAD4xxx的搜索模式呢?似乎无法剪切半个字节,我想最好将二进制字符串转换为ASCII十六进制字符串,并对其应用正则表达式。我不相信正则表达式是用来处理二进制数据的;您可能可以让它工作,但如果在过程中出现意外,请不要感到惊讶。如果我是您的情况,我会尝试使用grep进行hextump。正则表达式确实允许在范围内搜索。
my_pattern = re.compile(b"\xDE\xAD\x4F\xAD")
但是我如何推广搜索0xDEAD4xxx的搜索模式呢?似乎无法剪切半个字节,我想最好将二进制字符串转换为ASCII十六进制字符串,并对其应用正则表达式。我不相信正则表达式是用来处理二进制数据的;您可能可以让它工作,但如果在过程中出现意外,请不要感到惊讶。如果我是您的情况,我会尝试使用grep进行hextump。正则表达式确实允许在范围内搜索。因此,要查找第一个半字节为“4”的字节,请使用: 以下测试表明,它可以产生所需的输出:
>>> for byte in ('\x3f', '\x40', '\x42', '\x4f', '\x50'): print bool(pattern.search(byte))
...
False
True
True
True
False
要回答有关搜索0xDEAD4xxx的特定问题,请使用:
my_pattern = re.compile(b"\xDE\xAD[\x40-\x4F].")
当您第一次搜索的字节中有一个是regex元字符时,您会感到头疼。嘿,如果我希望搜索结果将最后3个十六进制字符作为一个单独的组返回给我,该怎么办?我如何在你做的东西之间插入()呢?不幸的是,AFAIK,只按字节分组,而不是按字节分组。嘿,没那么糟糕。Python提供了按位操作。因此,您可以取一个字节并将上半字节或下半字节归零,然后只处理剩下的部分。如果您有一些字节,比如说
byte=b'\x3c'
,那么,作为整数,下半字节是ord(byte)&ord(b'\x0f')
,上半字节是(ord(byte)&ord(b'\xf0')/16
我使用的:my\u pattern=re.compile(b'\xDE\xAD)([\x40-\x4F][\x00-\xFF]))得到两个组:my_integer=int(binascii.hexlify(sr.group(1)[-3:],16);
my_pattern = re.compile(b"\xDE\xAD[\x40-\x4F].")