2012-03-10 3 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을로드하고 있습니까? –

+0

@ Mike Kwan 네, 파일을'CreateFilemMapping' 등으로 메모리에 매핑 할 것입니다. – Aan

+0

바이너리 파일에 null 바이트가 없다면 어떻게 될지 생각해보십시오. 데이터의 2 진 스트림을 널로 끝나는 char 문자열로 처리 할 수 ​​없습니다. –

답변

1

여기에 옳고 그른 것은 없습니다. 여기서 고려해야 할 유일한 차이점은 문자열 대신 버퍼/크기 방식을 사용하는 것입니다.

파일을 읽는 방법도 고려해야합니다. 전체 파일을 메모리로 읽으려고합니까, 아니면 섹션으로 읽으시겠습니까?

섹션으로 읽으려면 각 섹션의 마지막 부분 (검색 패턴의 크기)을 저장하고 다음 섹션의 시작 부분에 추가하십시오. 이 방법으로 각 섹션의 컷오프가 평가됩니다.

1

당신이 인기있는 strstr 기능을 독자적으로 구현하려고 한 것 같습니다. 그러나 당신이 바이너리 패턴을 찾도록 요청한 이후로는 도움이되지 않습니다. 이 경우 사용해야하는 기능은 memmem입니다.

+0

리눅스 용입니까? 나는 Windows를 사용한다. – Aan

+0

맞습니다. 'memmem' 함수는 어디서나 사용할 수 없습니다. 그러나 'gitmemmem'이라는 git 프로젝트는 훌륭하고 간단한 구현이 있습니다. 당신은 직접하는 대신 그것을 사용할 수 있습니다. –

1

파일에서 패턴을 찾는 가장 좋은 방법을 찾고있는 것처럼 소리가납니다. 그렇다면, 단일 및 다중 패턴 검사를위한 아주 좋은 문서가있다 : P = A1A2 패턴을 감안할 때

이 ... AN, FND 텍스트에서 P의 모든 항목 T = b1b2 ... BM.

확장하는 경우를 다중 패턴 : 패턴 P1, P2, 세트가 지정 ... 텍스트에서의 P (PL)

FND 모든 항목 T = b1b2 ... BM.

간단한 설명을 보려면 document을, 자세한 구현 및 코드는 this one을 확인하십시오.

+0

넣은 링크가 작동하지 않습니다! – Aan

+0

@Adban 죄송합니다. 지금 링크를 업데이트했습니다. –

관련 문제