2012-03-10 57 views
0

我寫了以下功能在文本中發現這樣一個規律:在二進制文件中查找模式?

bool match(char* patt,char* text){ 

    int textLoc=0, pattLoc=0, textStart=0; 

    while(textLoc < (int) strlen(text) && pattLoc < (int)strlen(patt)){ 

     if(*(patt+pattLoc) == *(text+textLoc)){  
      textLoc= textLoc+1;   
      pattLoc= pattLoc+1;  
     } 
     else{   
      textStart=textStart+1; 
     textLoc=textStart;   
     pattLoc=0; 
     }  
    } 


    if(pattLoc >= (int) strlen(patt)) 
     return true; 
    else return false; 

} 

當它出現時,該功能將類型char*的兩個參數。我想用這個函數在binary file中找到一個模式,你建議如何執行這個問題?

+0

通過二進制文件,你是自己將文件映射到內存還是你加載它然後注入一個DLL? – 2012-03-10 12:42:01

+0

@ Mike Kwan是的我要通過'CreateFilemMapping'等映射內存中的文件..等 – Aan 2012-03-10 16:14:56

+0

請考慮如果您的二進制文件不包含空字節會發生什麼情況。您不能將二進制數據流視爲以空字符結尾的字符串。 – 2012-03-10 22:39:52

回答

1

這裏沒有對錯之分。我在這裏考慮的唯一區別是使用緩衝區/大小方法而不是字符串。

您還應該考慮如何閱讀文件。你打算將整個文件讀到內存中,還是要分段讀取它?

如果您要分段閱讀,請始終保存每個部分的最後部分(搜索模式的大小)並將其附加到下一部分的開頭。這樣,每個部分的截斷也將被評估。

1

在我看來,你試圖自己實現流行的strstr功能。但這不會對你有所幫助,因爲你要求找到一個二進制模式。在這種情況下你應該使用的函數叫memmem

+0

是否適用於linux?我使用Windows。 – Aan 2012-03-10 08:14:38

+0

你說得對,'memmem'函數在任何地方都不可用。但是git項目有一個很好而簡單的實現,叫做'gitmemmem'。你可以使用它而不是自己做。 – 2012-03-10 08:28:09

1

您聽起來更像是在尋找在文件中查找模式的最佳方法。如果是這樣,對於單個和多個圖案檢查一個很好的文件:

給定一個模式P = A1A2 ...一,測量值在文本P的所有出現T = B1B2 ... BM。

擴展到多模板的情況:給定一組的模式,P1,P2,..., PL,

測量值都在一個文本P的出現T = B1,B2 ... BM。

您可以查看document的簡單說明和this one的更詳細和不同的實現/代碼。

+0

你放的鏈接不起作用! – Aan 2012-03-10 08:23:04

+0

@Adban抱歉。現在更新鏈接。 – 2012-03-10 08:42:04