Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:二进制文件的正则表达式搜索模式(半字节)_Python_Regex_Binaryfiles - Fatal编程技术网

python:二进制文件的正则表达式搜索模式(半字节)

python:二进制文件的正则表达式搜索模式(半字节),python,regex,binaryfiles,Python,Regex,Binaryfiles,我使用以下正则表达式模式在二进制文件中搜索0xDEAD4FAD: my_pattern = re.compile(b"\xDE\xAD\x4F\xAD") 但是我如何推广搜索0xDEAD4xxx的搜索模式呢?似乎无法剪切半个字节,我想最好将二进制字符串转换为ASCII十六进制字符串,并对其应用正则表达式。我不相信正则表达式是用来处理二进制数据的;您可能可以让它工作,但如果在过程中出现意外,请不要感到惊讶。如果我是您的情况,我会尝试使用grep进行hextump。正则表达式确实允许在范围内搜索。

我使用以下正则表达式模式在二进制文件中搜索0xDEAD4FAD:

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].")