2016-06-01 2 views
-2

나는 패턴을 가지고있다.부호없는 char 포인터의 사용

나는 바이트 스트림을 가지고 있으며,이 바이트의 얼마나 많은 발생이 내 바이트 스트림에 존재 하는지를 알아야한다. 패턴은 모든 비트 위치에서 찾을 수 있습니다.

+0

항상 비트 패턴 단일 바이트인가? – dasblinkenlight

+2

아직 시도한 것은 무엇입니까? 비트 연산자에 대해서 읽어야합니다 : <<, >>, &&, ^, ~, .... – Garf365

+1

앞에 오는 0을 수행합니까? 예를 들어, 내 패턴이 '0x05'이고 스트림이'00, 00, A5, 00, 00 '이면 대답 1 또는 2입니까? – dasblinkenlight

답변

1

파일을 한 번에 한 바이트 씩 읽고 테스트 변수로 비트를 회전하여 작동합니다. 문자열에서 읽을 수 있도록 수정할 수 있습니다 ("팻"코드를 사용하지 않으려 고 함). TEST.TXT의

#include <stdio.h> 

size_t count_patt(char *filename, unsigned char pattern) 
{ 
    size_t count = 0; 
    int byteA, byteB, bits = 0; 
    FILE *fp; 
    if((fp = fopen(filename, "rb")) == NULL) { 
     return count; 
    } 
    if((byteA = fgetc(fp)) == EOF) { 
     return count; 
    } 
    while(1) { 
     if(byteA == pattern) { 
      count++; 
     } 
     if(bits <= 0) { 
      if((byteB = fgetc(fp)) == EOF)   // refresh byte B 
       break; 
      bits = 8;        // which has 8 bits 
     } 
     byteA = (byteA << 1) & 0xFF;    // rotate byte A left 
     if((byteB & 0x80) != 0) { 
      byteA++;        // shift in ms bit of byte B 
     } 
     byteB <<= 1;        // rotate byte B left 
     bits--;          // bit tally 
    } 
    return count; 
} 

int main() 
{ 
    printf("%zu bytes\n", count_patt("test.txt", 0x31)); 
} 

내용 (2 바이트 01,000,010 01,100,011)

Bc 

프로그램 출력

1 bytes 
+0

'size_t'유형의 한계까지 모든 길이 데이터에서 작동합니다. 나는 한 번에 파일에서 8 비트를 가져와'int '에 저장한다. 왜냐하면 그것이'fgetc'의 리턴 타입이기 때문이다. 그런 다음 한 번에 1 비트 (8 개)를 테스트 변수로 이동합니다. 파일 대신 문자 배열에서 각 값을 읽을 수없는 이유는 없습니다. 나는 당신이 필요로하는 정확한 코드를 쓰지 않을 것입니다, 답에 명시된 바와 같이, 이것은 당신에게 그것에 대해 어떻게 움직이는지를 알려주는 것입니다. 죄송합니다. 파일을 닫는 것을 잊어 버렸습니다. –

+0

마스크'0xFF'와 함께'byteA'의 최하위 8 비트만을 사용하고 있으며'0x80' 마스크로'byteB'의 비트 7을 추출하여'byteA '의 비트 0으로 어떻게 이동하는지 주목하십시오 '. 'unsigned char'을 사용한다면 그것은 동일 할 것입니다. 그것은 알고리즘과 아무런 차이가 없습니다. –

+0

그것을'int'에 복사 한 후 내가했던 것처럼 조작합니다. 'unsigned char'는'int'로 안전하게 승격 될 수 있습니다. 왜냐하면'int'는'unsigned char'의 가능한 모든 값을 가질 수 있기 때문입니다. 파일에서 바이트를 읽는 대신 문자열에서 읽으십시오. –

관련 문제