1.前言
InfinityHook里面有个搜索字符串的算法比较有意思,如果是在C#里面一行代码即可搜索。但C++则是承担了底层的实现。如何实现的呢?本篇来看下
2.概括
在source里面搜索pattern相同字符串,分别看下C#和C++代码
C#代码:
static void Main(string[] args){string source= "39 39 39 48 33 33 33 33 33 33 48 85 C0 74 39 39 39";string pattern = "48 33 33 33 33 33 33 48 85 C0 74";string result=source.Substring(source.IndexOf(pattern),pattern.Length-5);Console.WriteLine(result);}
C++代码
int main(int argc, char** argv){/*案例算法:在source数组里面找到pattern数组里面相同的字符。*///数组source里面包含了数组patteren的字符char source[] = "\x39\x39\x39\x48\x33\x33\x33\x33\x33\x33\x48\x85\xC0\x74\x39\x39\x39";char pattern[] = "\x48\x33\x33\x33\x33\x33\x33\x48\x85\xC0\x74";int sourcelength = sizeof(source) - 1;int patternlength = sizeof(pattern) - 1;char wildcard = 0x33;//这里source数组长度减去pattern数组长度是为免得下面的for多循环patternlength个体长度for (int i = 0; i < sourcelength - patternlength; i++){//found表示如果pattern里面的字符不等于0x33也不等于source数组的的某个字符,直接跳过本轮for循环。//因为没有找到匹配的bool found = true;//如果这个for循环到底,found依旧为true,说明找到了,相同字符串的起始索引。for (int j = 0; j < patternlength; j++){//这里的判断分为几种情况// 1. pattern[j] != wildcard==true pattern[j] != (source[i + j] 直接跳过本轮循环,因为没有找到// 2. pattern[j] != wildcard==true pattern[j] = = (source[i + j] 表示找到了相同字符串,继续// 3. pattern[j] == wildcard==true 如果是这种情况,第一个判断为false,第二个就不用判断了,继续下一次循环if (pattern[j] != wildcard && pattern[j] != (source[i + j])){found = false;break;}}if (found != false){//这个地方的i索引是第一个for循环+第二个for循环//在source字符数组里面找到pattern数组相同的字符的其实索引//这里以为i已经在索引3的位置了,所以下面的循环只能到pattern数组的第二个\x48.后面的3个超了数组的索引极限// 比如 patternlength+ifor (int k = i; k < patternlength; k++){printf("%x\n", source[k]);}break;}}getchar();}
可以看到C#高度封装,比较简单的几行代码,然C++则多了更多的代码。但C++的算法比较奇特,这里记录下。
