You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则从4GB二进制文件中查找特定十六进制模式并获取偏移

问题分析与解决方案

原正则表达式的错误点

  1. 字符集误用:你写的[E500608FE0]是字符集匹配逻辑,只会匹配括号内的单个字符,而非完整的固定十六进制串E500608FE0,这是匹配失败的核心原因。
  2. 大小写不匹配:代码中将二进制数据转成了大写十六进制(.upper()),但正则使用[a-f0-9]的小写范围,无法匹配大写字符。
  3. 模式结构错误:目标模式的固定段是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:05:28