您当然可以为此使用正则表达式,虽然这可能不是最快的方法,但这取决于您的需要。你只是想找到职位吗?是否要提取内存区域的副本?或者只是比赛中的一些内存位置?
这是一个std::regex 选项:
char const* find_chunk(char const* const beg, char const* const end)
{
static std::regex const re{R"(\x48\x8D....\xE8)", std::regex_constants::optimize};
std::cmatch m;
if(!std::regex_search(beg, end, m, re))
return end;
return m[0].first;
}
一种可能更快的方法是手动检查图案部分,如下所示:
char const* find_chunk(char const* const beg, char const* const end)
{
static char const match[] = {'\x48', '\x8D'};
auto found = std::search(beg, end, std::begin(match), std::end(match));
if(std::distance(found, end) > 6 && found[6] == '\xE8')
return found;
return end;
}
正如 cmets 中提到的,另一种方法是像这样使用std::optional<char>:
char const* find_chunk(char const* const beg, char const* const end)
{
static std::optional<char> const m[] = {{'\x48'}, {'\x8D'}, {}, {}, {}, {}, {'\xE8'}};
return std::search(beg, end, std::begin(m), std::end(m), [](auto a, auto b){
if(!b.has_value())
return true;
return a == b.value();
});
}