나는 패턴을 가지고있다.부호없는 char 포인터의 사용
나는 바이트 스트림을 가지고 있으며,이 바이트의 얼마나 많은 발생이 내 바이트 스트림에 존재 하는지를 알아야한다. 패턴은 모든 비트 위치에서 찾을 수 있습니다.
나는 패턴을 가지고있다.부호없는 char 포인터의 사용
나는 바이트 스트림을 가지고 있으며,이 바이트의 얼마나 많은 발생이 내 바이트 스트림에 존재 하는지를 알아야한다. 패턴은 모든 비트 위치에서 찾을 수 있습니다.
파일을 한 번에 한 바이트 씩 읽고 테스트 변수로 비트를 회전하여 작동합니다. 문자열에서 읽을 수 있도록 수정할 수 있습니다 ("팻"코드를 사용하지 않으려 고 함). 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
'size_t'유형의 한계까지 모든 길이 데이터에서 작동합니다. 나는 한 번에 파일에서 8 비트를 가져와'int '에 저장한다. 왜냐하면 그것이'fgetc'의 리턴 타입이기 때문이다. 그런 다음 한 번에 1 비트 (8 개)를 테스트 변수로 이동합니다. 파일 대신 문자 배열에서 각 값을 읽을 수없는 이유는 없습니다. 나는 당신이 필요로하는 정확한 코드를 쓰지 않을 것입니다, 답에 명시된 바와 같이, 이것은 당신에게 그것에 대해 어떻게 움직이는지를 알려주는 것입니다. 죄송합니다. 파일을 닫는 것을 잊어 버렸습니다. –
마스크'0xFF'와 함께'byteA'의 최하위 8 비트만을 사용하고 있으며'0x80' 마스크로'byteB'의 비트 7을 추출하여'byteA '의 비트 0으로 어떻게 이동하는지 주목하십시오 '. 'unsigned char'을 사용한다면 그것은 동일 할 것입니다. 그것은 알고리즘과 아무런 차이가 없습니다. –
그것을'int'에 복사 한 후 내가했던 것처럼 조작합니다. 'unsigned char'는'int'로 안전하게 승격 될 수 있습니다. 왜냐하면'int'는'unsigned char'의 가능한 모든 값을 가질 수 있기 때문입니다. 파일에서 바이트를 읽는 대신 문자열에서 읽으십시오. –
항상 비트 패턴 단일 바이트인가? – dasblinkenlight
아직 시도한 것은 무엇입니까? 비트 연산자에 대해서 읽어야합니다 : <<, >>, &&, ^, ~, .... – Garf365
앞에 오는 0을 수행합니까? 예를 들어, 내 패턴이 '0x05'이고 스트림이'00, 00, A5, 00, 00 '이면 대답 1 또는 2입니까? – dasblinkenlight