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

Python实现:在十六进制文件中查找指定串并提取后续20字节

问题描述

我有一个存储十六进制数据(格式示例:"0A 04 64 72 BD 03...")的大文件,需求为查找指定字符串(示例:"BA 1B 65 01"),每次找到该字符串后,提取其之后的20字节并追加到新文件,且需支持多匹配场景的处理。目前仅实现了基础的查找代码,询问如何在Python中实现提取并输出匹配串后的20字节。现有代码如下:

file = open('hexfile', 'r')
read = file.readlines()

modified = []
i = "BA 1B 65 01"

for line in read:
    if i in line:
        print("found")
        #print -> 20bytes after i?
解决方案

直接按行读取可能会遇到匹配串跨行的问题,更稳妥的方式是把整个文件的十六进制数据转换成连续的字节列表来处理,以下是实现代码:

# 配置参数
SOURCE_FILE = 'hexfile'
TARGET_FILE = 'output_hex.txt'
SEARCH_PATTERN = "BA 1B 65 01"
EXTRACT_BYTES = 20

# 读取源文件并处理成单个十六进制字节的列表
with open(SOURCE_FILE, 'r') as f:
    # 移除换行符,按空格分割,过滤空字符串(处理多余空格)
    hex_bytes = [byte for byte in f.read().replace('\n', '').split(' ') if byte]

# 把搜索模式转换为字节列表
pattern = SEARCH_PATTERN.split(' ')
pattern_length = len(pattern)

# 遍历查找所有匹配项并提取数据
with open(TARGET_FILE, 'a') as out_file:
    for idx in range(len(hex_bytes) - pattern_length):
        # 检查当前位置是否匹配目标模式
        if hex_bytes[idx:idx+pattern_length] == pattern:
            print("找到匹配项")
            # 计算提取范围,防止索引越界
            end_pos = idx + pattern_length + EXTRACT_BYTES
            extracted_data = hex_bytes[idx+pattern_length : end_pos]
            
            # 若剩余字节不足20,给出提示
            if len(extracted_data) < EXTRACT_BYTES:
                print(f"匹配项后仅剩余 {len(extracted_data)} 字节,已全部提取")
            
            # 将提取的字节拼接成字符串并追加到输出文件
            out_file.write(' '.join(extracted_data) + '\n')

关键说明

  • 用with语句管理文件,自动处理文件的打开与关闭,避免资源泄漏
  • 将整个文件内容转换为字节列表,彻底解决匹配串跨行的问题,处理逻辑更精准
  • 遍历列表查找所有匹配的起始位置,天然支持多匹配场景
  • 提取时做了越界检查,避免因文件末尾不足20字节导致的报错
  • 输出文件以追加模式打开,每次匹配结果都会追加到文件末尾

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:20:31