close

Search.h:

 

#pragma once

 

bool Replace(char * s,const char * searchstr,const char * replstring,size_t length);

//bool CompareChar(const char src, char* cmp); //替換函數

int FindWithWildcards(const char* source, const char* findstring, size_t len);

//char * Byte2Hex(char b); //尋找寬通配符

 

Search.cpp:

 

#include "StdAfx.h"

#include <math.h>

 

bool CompareChar(const char src, char* cmp)//比較char

{

if(strstr(cmp, "??")) // ??查找是否有"??"

return true;

 

if(strstr(cmp, "?") == cmp) // ?6是否有

{

char low = src % 0x10;//源字串%0x10

char val = (char)strtoul(cmp + 1, 0, 16);//轉換為16進制

if(val == low)//如果與前面顯得

return true;//返回真

return false;

}

else if(strstr(cmp, "?") == cmp + 1) // 5?如果"?"在cmp+1的位置

{

cmp[1] = 0;//第二位為0

char high = (src - src % 0x10) / 0x10;//高位計算結果

char val = (char)strtoul(cmp, 0, 16);//轉換16進制

if(val == high)//如果等於高位

return true;//為真

return false;

}

else // 56

{

char high = (src - src % 0x10) / 0x10;//其他高位計算

char low = src % 0x10;//低位計算

char val2 = (char)strtoul(cmp + 1, 0, 16);//轉換為16進制

cmp[1] = 0;//第二位為0

char val1 = (char)strtoul(cmp, 0, 16);//16進制轉換

if(high == val1 && low == val2)//如果高位和低位等於轉換結果

return true; //返回真

return false;

}

}

 

int FindWithWildcards(const char* source, const char* findstring, size_t len)

{

char cmp[3] = {0};  //第三位為{0}

int findlen = ceil(((double)strlen(findstring) / 2));//尋找長度為向上捨入字串findstring長度的一半

if(len < findlen)//如果輸入長度小於字串findstring長度

return -1;//返回-1

 

for(int i = 0; i < len; i++)  //len長度內循環

{

for(int j = 0; j < findlen; j++)//findlen長度內循環

{

strncpy(cmp, findstring + j * 2, 2);  //複製2個字節的cmp

if(!CompareChar(source[i+j], cmp))//比較字串

break;

else if(j == (findlen - 1))//如果尋找長度為循環次數

return i;//返回i

}

}

return -1;

}

 

 

arrow
arrow

    lypwell 發表在 痞客邦 留言(0) 人氣()