# define ARRAY_NUM (a) ((sizeof (a))/(sizeof ([0]))) typedef unsigned char字节; void getnext_bin (byte 子[],int 小尺寸,,int 下[]) {//,得到接下来的数据,其实本质是自身公里匹配 printf (“sub  bin array :,“); int i, j。 小姐:=,0; 时间=j 1; 下一个[0],=,1; TRACE (_T (“% d \ n"),下一个[我]); while (小姐:+,- 1,& lt;,小尺寸) { if (j ==, 1, | |,子[我],==,子[j]) { + +我; + + j; 1 # if if (子[我],!=,子[j]) { 下一个[我],=,j。 } 其他的 { 下[我],=,下一个[j]; } 其他# 下一个[我],=,j。 # endif TRACE (_T (,,, % d \ n"),,下一个[我]); } 其他的 { 时间=j 下[j]; } } printf (“\ n"); } int kmp_bin (byte 主要[],int mainSize,, byte 子[],,int 小尺寸,,int 下[]) {//,返回s在m中的第一个数据的下标 int i, j。 小姐:=,0; 时间=j 0; int nIndex =, 1; while (小姐:& lt;, mainSize) { if (j ==, 1, | |,主要[我],==,子[j]) { + +我; + + j; if (j ==,小尺寸) { nIndex =,(小姐,安康;j); 打破; } } 其他的 { 时间=j 下[j]; } } return nIndex; }
调用方法:
void CtestDlg: OnBnClickedButton2 () { FILE , *,《外交政策》; _wfopen_s(和fp, _T (“c: \ \ Install.exe"),, _T (“rb")); fseek (fp, 0,, SEEK_END); INT , length =, ftell (fp); fseek (fp, 0,, SEEK_SET); byte * pBuff =, new 字节(长度); memset (pBuff, 0,长度); 从文件中读(pBuff,长度,,1,,fp); byte t [],=, {utf - 8,“; @Install@ ! !, ! @InstallEnd@ !“,};//,二进制序列的公里 int 其次[ARRAY_NUM (t)),=, {, 0}; getnext_bin (t), sizeof (t),下一个); TRACE (“kmp_bin ,=, % d \ n",, kmp_bin (pBuff,,长度,,t, 33岁,明年)); 文件关闭(fp); delete [] pBuff; }