如何用正则从4GB二进制文件中查找特定十六进制模式并获取偏移
问题分析与解决方案
原正则表达式的错误点
- 字符集误用:你写的
[E500608FE0]是字符集匹配逻辑,只会匹配括号内的单个字符,而非完整的固定十六进制串E500608FE0,这是匹配失败的核心原因。 - 大小写不匹配:代码中将二进制数据转成了大写十六进制(
.upper()),但正则使用[a-f0-9]的小写范围,无法匹配大写字符。 - 模式结构错误:目标模式的固定段是10个十六进制字符(对应5字节),原正则的写法没有正确对应这个长度的完整字符串。
修正后的完整代码
以下代码修复了正则问题,同时实现了你需要的偏移量获取功能:
import re # 正则对应目标模式:3个任意字节(6位十六进制) + 固定段1 + 3个任意字节(6位十六进制) + 固定段2 pattern = re.compile(r"[A-F0-9]{6}E500608FE0[A-F0-9]{6}E5040080E0") with open("file.bin", 'rb') as in_file: current_offset = 0 while True: # 每次读取16字节(刚好等于目标模式总长度:3+5+3+5=16字节) chunk = in_file.read(16) if not chunk: break hex_data = chunk.hex().upper() if pattern.search(hex_data): print(f"找到匹配,偏移量:0x{current_offset:X}(十进制:{current_offset})") current_offset += len(chunk)
额外优化提示
如果目标模式存在跨16字节块的可能(比如前一个块的末尾字节和后一个块的开头字节组成完整模式),上述固定块读取的方式会漏匹配,可改用滑动窗口读取:
import re pattern = re.compile(r"[A-F0-9]{6}E500608FE0[A-F0-9]{6}E5040080E0") target_length = 16 buffer = b"" with open("file.bin", 'rb') as in_file: current_offset = 0 while True: byte = in_file.read(1) if not byte: break buffer += byte # 缓冲区达到目标长度时检查匹配 if len(buffer) == target_length: hex_data = buffer.hex().upper() if pattern.search(hex_data): print(f"找到匹配,偏移量:0x{current_offset:X}(十进制:{current_offset})") # 滑动窗口:移除第一个字节,继续后续匹配 buffer = buffer[1:] current_offset += 1
内容的提问来源于stack exchange,提问作者Abdul Moez
相关产品推荐
相关产品推荐

