如何用Python查找指定十六进制字节并获取后续3个字节?
诊断工具字节序列的搜索与提取(Python实现)
核心思路
直接利用Python内置的bytes类型及其方法完成搜索和提取,这是最高效的方式——因为bytes的方法底层由C实现,比手动遍历快得多。
步骤实现
1. 转换输入为bytes对象
先把空格分隔的十六进制字符串转换成Python的bytes类型,这是处理二进制数据的标准类型:
# 原始十六进制序列输入 hex_input = "35 04 65 FF D0 00 10 24 D0 01 10 24 E0 20 10 2C 84 D0 05 10 24 D0 07 10 24" # 转换为bytes对象(fromhex自动忽略空格) byte_data = bytes.fromhex(hex_input) # 定义要搜索的目标子序列 target_seq = bytes.fromhex("E0 20")
2. 搜索目标序列并提取后续字节
用bytes.find()方法快速定位目标序列的起始位置,再通过切片提取后续3个字节:
# 查找目标序列的起始索引,未找到返回-1 start_pos = byte_data.find(target_seq) if start_pos != -1: # 计算后续字节的起始和结束位置 extract_start = start_pos + len(target_seq) extract_end = extract_start + 3 # 检查是否有足够的后续字节 if extract_end <= len(byte_data): result_bytes = byte_data[extract_start:extract_end] # 转换为易读的十六进制字符串输出 print(result_bytes.hex(" ").upper()) # 输出:10 2C 84 else: print("目标序列后字节不足3个") else: print("未找到目标序列")
关键知识点
bytes类型:Python专门用于二进制数据的类型,支持所有字符串式的序列操作(切片、查找等),操作效率极高。bytes.find():内置的子序列查找方法,时间复杂度为O(n),底层C实现,比手动写循环遍历快数倍,适合处理诊断工具这类可能较长的字节序列。- 切片操作:
bytes的切片和字符串切片逻辑一致,通过[start:end]可以快速提取子序列,非常直观。
备选方案(正则匹配)
如果需要处理更复杂的字节匹配规则,可以用re模块的二进制模式,但对于简单的固定子序列搜索,bytes.find()更简洁高效:
import re match = re.search(target_seq, byte_data) if match: start_pos = match.start() # 后续提取逻辑和上面一致
内容的提问来源于stack exchange,提问作者Joseph Stalin Pillai
相关产品推荐
相关产品推荐

