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

Python脚本匹配二进制Dump文件时TypeError报错的修复咨询

修复二进制Dump文件配置段匹配脚本的类型错误

问题背景

需要编写Python脚本,在二进制Dump文件中查找重复的配置段——该段以202个0xff字节开头,后跟4字节\x00\x00\x23\x27,并打印所有匹配段的起始地址。

原脚本与错误信息

原脚本

#!/usr/bin/env python3
import re
import mmap
import sys

magic = '\xff' * 202
pattern = magic + '\x00\x00\x23\x27'

fh = open(sys.argv[1], "r+b")
mf = mmap.mmap(fh.fileno(), 0)
mf.seek(0)
fh.seek(0)
for occurence in re.finditer(pattern, mf):
    print(occurence.start())
mf.close()
fh.close()

运行错误

$ ./matcher.py dump.bin
Traceback (most recent call last):
  File "/home/eviecomp/BC2UTILS/dump_previous_profile/./matcher.py", line 13, in <module>
    for occurence in re.finditer(pattern, mf):
  File "/usr/lib/python3.9/re.py", line 248, in finditer
    return _compile(pattern, flags).finditer(string)
TypeError: cannot use a string pattern on a bytes-like object

错误原因

mmap.mmap对象属于字节类对象(bytes-like),但原脚本中定义的pattern是字符串类型,正则表达式无法用字符串模式匹配字节数据,导致类型不兼容错误。

修复后的脚本

#!/usr/bin/env python3
import re
import mmap
import sys

# 改用字节串定义匹配模式,前缀b表示字节类型
magic = b'\xff' * 202
pattern = magic + b'\x00\x00\x23\x27'

# 使用with语句自动管理文件和mmap资源
with open(sys.argv[1], "rb") as fh:
    with mmap.mmap(fh.fileno(), 0, access=mmap.ACCESS_READ) as mf:
        # 模式与目标均为字节类型,匹配正常执行
        for occurrence in re.finditer(pattern, mf):
            print(occurrence.start())

关键修复点

  • 类型统一:将匹配模式从字符串改为字节串(前缀b),确保与mmap对象的字节类型一致。
  • 资源自动管理:改用with语句处理文件和mmap对象,无需手动调用close(),避免资源泄漏。
  • 访问权限明确:指定mmap的access=mmap.ACCESS_READ,符合只读匹配的场景,提升安全性。

内容的提问来源于stack exchange,提问作者Lexx Luxx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:47:33