close

char HexString2BinChar(const char *s) //hex字符串轉換到bin char

{

char HexBuf[3];

strncpy(HexBuf,s,2); //賦值參數s到局部變量hexbuf

HexBuf[2]=0;

return (char)strtoul(HexBuf,0,16); //轉換到16進制

}

 

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

{

char * ps=s; //定義參數s的指針

bool WasReplaced=false;  //替換標誌

if (strlen(searchstr)!=strlen(replstring))  //參數搜索字串的長度不等於參數替換字符串長度

throw("Search string and replace strings should be of equal length");  //顯示均等

 

if (strlen(searchstr)%2) //如果參數搜索字串長度為0

throw("Bad search string"); //顯示錯誤

 

if ((strlen(searchstr)/2)>length) //搜索字串長度的一半大於參數指定長度

throw("The size of data is too small"); //數據大小不夠

 

size_t ReplaceLength=strlen(replstring)/2; //替換長度的一半

 

size_t offs=0;

 

bool equal=true;

unsigned i=0;

unsigned j=0;

 

//Wildcard Search

while (i<strlen(replstring)) //如果i小於replstring長度

{

if (strncmp("??",&searchstr[i],2)) // 如果if searchstr[i] != "??"

{

if ((searchstr[i]=='?') || (searchstr[i+1]=='?'))//如果searchstr的第i或者第i+1為為?

{

unsigned char mask=0; //定義一個變量mask

 

char maskbuf[3];

 

if (searchstr[i]=='?') //如果i位為?

{

maskbuf[0]=searchstr[i+1]; // "?5"

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

 

if (s[j]>0xF) //如果s的第j為大於0xF

equal=false; //假

 

mask=0x0F; //mask為0xF

 

}

else

{

maskbuf[0]=searchstr[i]; // "5?"

maskbuf[1]='0';

maskbuf[2]=0;

mask=0xF0;

}

 

 

if ((char)(s[j]&mask)-(char)strtoul(maskbuf,0,16))

equal=false;//如果s[j]&mask減去十六進制maskbuf,為假

 

if (!equal)

break; //中斷

}

else

if (HexString2BinChar(&searchstr[i])!=s[j]) //hex字符串轉換到bin char

{

equal=false;

break;

}

 

}

else

{

i+=2;

i-=2;

}

i+=2;

j++;

 

}

 

//Wildcard Replacment

if (equal) //如果為真

{

if (!strstr(replstring,"?")) // no wildcards如果沒有?

{

char * replacestring;

try

{

replacestring=HexString2BinArray(replstring); //轉換hex字符串到bin 數組

}

catch (...)

{

throw("Bad replace string"); //轉換不了顯示錯誤

}

memcpy(s,replacestring,ReplaceLength); //複製

delete replacestring;

}

else //replace by wildcard

for (i=0;i<ReplaceLength;i++)

{

if (strncmp("??",&replstring[i*2],2)) // if searchstr[i] != "??"如果為??

{

if ((replstring[i*2]=='?') || (replstring[i*2+1]=='?')) //

{

 

if (replstring[i*2]=='?') //?5

ps[i]=(ps[i]& 0xF0) | WildSymbolToChar(&replstring[i*2]);

else //5?

ps[i]=(ps[i]& 0x0F) | WildSymbolToChar(&replstring[i*2]);

}

else

ps[i]=HexString2BinChar(&replstring[i*2]); //not wildcard replacement

}

}

WasReplaced=true;

}

return WasReplaced;

}

 

char * Byte2Hex(char b) //字節到hex

{

char * buf=new char[3];

sprintf(buf,"%02X",(unsigned char)b); //打印緩衝區

return buf;

}

arrow
arrow

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