2016-06-01 3 views
-2

У меня есть образециспользование знака указателя полукокса

и у меня есть поток байтов, и мне нужно найти, сколько вхождений этого байта присутствует в моем потоке байтов. Шаблон можно найти в любом битовом положении.

+0

ли битовый шаблон всегда один байт? – dasblinkenlight

+2

Что вы еще пробовали? Вы должны прочитать о побитовом операторе: <<, >>, &, |, ^, ~, .... – Garf365

+1

Нужны ли ведущие нули? Например, если мой шаблон равен «0x05», а мой поток «00, 00, A5, 00, 00', является ответом 1 или 2? – dasblinkenlight

ответ

1

Это работает, читая файл по одному байту за раз и поворачивая биты в тестовую переменную. Вы можете изменить его для чтения из строки (не желая дать вам «погладить» код).

#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)); 
} 

Содержание из test.txt (2 байта 01000010 01100011)

Bc 

выходные Программа

1 bytes 
+0

Он будет работать с данными любой длины до предела типа 'size_t'. Я получаю 8 бит из файла за раз и сохраняю их в 'int', потому что это возвращаемый тип' fgetc'. Затем я сдвигаю 1 бит (по 8) за раз в тестовую переменную. Нет причин, по которым вы не можете читать каждое значение из массива символов, а не из файла. Я не собираюсь писать точный код, который вам нужен, как указано в ответе, чтобы дать вам представление о том, как это сделать. PS жаль, что я забыл закрыть файл. –

+0

Обратите внимание, что я использую только наименее значимые 8 бит 'byteA' с маской' 0xFF' и замечаю, как я всегда извлекаю бит 7 'byteB' с помощью маски' 0x80', чтобы перейти в бит 0 'byteA '. Это было бы то же самое, если бы я использовал 'unsigned char' - это не имеет никакого отношения к алгоритму. –

+0

Скопировав его в 'int', тогда манипулируйте им, как я. 'Unsigned char' можно безопасно продвигать в' int', потому что 'int' может содержать все возможные значения' unsigned char'. Вместо чтения байта из файла, прочитайте его из своей строки. –

Смежные вопросы