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

如何在匹配的字节码索引范围内查找子串的字节码位置?

解决字节码范围内查找特定字符位置的问题

我明白你的需求啦——你手里有一个字节码字符串,还有从编辑器拿到的匹配字节索引范围,现在要在这些范围内找出所有字母o的位置,并且转换成原字节串里的字节码索引对吧?而且你也提到要注意不能用普通字符串的start()/end(),因为那些不是字节层面的索引,这点很关键!

下面我给你一步步拆解实现思路,再附上Python代码示例:

核心思路

  1. 确保操作对象是字节串:因为我们要处理的是字节码索引,所以你的mystring必须是bytes类型(而不是普通的str字符串),这样切片和查找都是基于字节的。
  2. 遍历每个匹配范围:对每个[start_byte, end_byte]的字节范围,从原字节串中提取对应的子字节串。
  3. 在子字节串中查找o的位置:因为o在UTF-8编码里是单字节(十六进制0x6F),所以直接查找b'o'即可。找到子串里的每个o的字节位置后,加上当前匹配范围的起始字节索引,就是它在原字节串里的真实字节码位置。

Python代码示例

# 示例字节串(替换成你的实际字节串)
mystring = b"Hello ëworld! This is another string with o and oops, let's check ëxample"
# 编辑器返回的匹配字节索引范围
matches = [[35, 43], [44, 49], [58, 62]]

# 存储所有找到的o的原字节码位置
o_positions = []

for start_byte, end_byte in matches:
    # 提取当前匹配范围的子字节串
    sub_bytes = mystring[start_byte:end_byte]
    # 初始化查找起始位置
    current_pos = 0
    while True:
        # 在子字节串中查找b'o',从current_pos开始
        o_index = sub_bytes.find(b'o', current_pos)
        if o_index == -1:
            # 找不到更多o了,退出循环
            break
        # 转换为原字节串的字节索引,加入结果列表
        original_pos = start_byte + o_index
        o_positions.append(original_pos)
        # 更新下一次查找的起始位置,避免重复匹配同一个o
        current_pos = o_index + 1

print("找到的o在原字节串中的字节码位置:", o_positions)

关键细节说明

  • 字节串的切片:mystring[start_byte:end_byte]直接按字节索引切片,完全符合你的匹配范围要求,不会因为多字节字符(比如ë是2字节)出现偏移问题。
  • 循环查找所有匹配:用find()循环而不是count(),是因为我们需要每个o的具体位置,而不只是数量。每次找到后更新current_pos,确保不会重复查找同一个字符。
  • 类型注意:如果你的原始数据是字符串(str),记得先转换成字节串,比如用mystring.encode('utf-8'),这样才能基于字节操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:17:26