您好,登錄后才能下訂單哦!
#define ARRAY_NUM(a) ((sizeof(a))/(sizeof(a[0]))) typedef unsigned char byte; void getnext_bin(byte sub[], int subSize, int next[]) { // 得到next數(shù)據(jù),其實(shí)本質(zhì)是自身KMP匹配 printf("sub bin array : "); int i, j; i = 0; j = -1; next[0] = -1; TRACE(_T("%d\n"), next[i]); while (i + 1 < subSize) { if (j == -1 || sub[i] == sub[j]) { ++i; ++j; #if 1 if (sub[i] != sub[j]) { next[i] = j; } else { next[i] = next[j]; } #else next[i] = j; #endif TRACE(_T(", %d\n"), next[i]); } else { j = next[j]; } } printf("\n"); } int kmp_bin(byte main[], int mainSize, byte sub[], int subSize, int next[]) { // 返回s在m中的第一個(gè)數(shù)據(jù)的下標(biāo) int i, j; i = 0; j = 0; int nIndex = -1; while (i < mainSize) { if (j == -1 || main[i] == sub[j]) { ++i; ++j; if (j == subSize) { nIndex = (i - j); break; } } else { j = next[j]; } } return nIndex; }
調(diào)用方法:
void CtestDlg::OnBnClickedButton2() { FILE * fp; _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 byte[length]; memset(pBuff, 0, length); fread(pBuff, length, 1, fp); byte t[] = { ";!@Install@!UTF-8!;!@InstallEnd@!" }; // 二進(jìn)制序列的KMP int next[ARRAY_NUM(t)] = { 0 }; getnext_bin(t, sizeof(t), next); TRACE("kmp_bin = %d\n", kmp_bin(pBuff, length, t, 33, next)); fclose(fp); delete []pBuff; }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。