Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2013, 18:47   #1
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию Поиск по маске

Здравствуйте!
Необходимо реализовать поиск в файле (открытый на чтение в текстовом режиме)
например такой строки:
?? ?? ?? ?? ?? 66 9C 60 50 8D 88 ?? F0 ?? ?? 8D 90
знак вопроса неизвестный символ.
Кто сталкивался с подобным вопросом?
В каком направлении двигаться?
Буду благодарен за статьи и ссылки или примеры на си.
С Уважением Алексей.
Alexey_68 вне форума Ответить с цитированием
Старый 10.06.2013, 21:17   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Самое простое - считать в некий буфер нужное количество чисел (17 16-ричных чисел). Затем, сравнить с эталоном (специальным образом пометить "неважные" числа, чтобы по ним не проводилось сравнение). Если не совпало, то считать еще 1 число (буфер сделать циклическим), выкинув первый символ из буфера, и повторить сравнение. Таким образом или найдем эту строку в файле, или дойдем до конца файла.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.06.2013, 00:45   #3
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

спасибо за совет, но не совсем понял (проблемы с программной реализацией)

FILE *fop;
char c[200];
char search[] = "?? 8D 90 04 16 ?? ??";

fop = fopen("1.txt", "r+");

fseek (fop,0,SEEK_SET);

while (!feof(fop))
{
fgets(c, sizeof(c), fop);
if (strstr(c, search))
printf("%X\n", c);
}
считывание посимвольно с помощью fread?
Alexey_68 вне форума Ответить с цитированием
Старый 11.06.2013, 10:44   #4
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <stdio.h>
#include <string.h>
#include <malloc.h>




// поиск подстроки по-маске
char*  t_strstr(const char* s, const char* m, const char** e) {
        const char* a, *b;
        while(*s) {
                a = s;
                b = m;
                while(*a && (((*a == *b) || (*b == '?')))) {
                     ++a;
                     ++b;
                     if(! *b) {
                        *e = a;
                        return (char*)s;
                     }
                }
                ++s;
        }
        *e = NULL;
        return NULL;
}




int main(void)
{
        FILE* fp;
        char* buf;
        long size;
        const char* ptr, *end;
        char search[] = "?? 8D 90 04 16 ?? ??";

        fp = fopen("hex.txt", "r");
        if(! fp)
                return 1;

        fseek(fp, 0L, SEEK_END);
        size = ftell(fp);
        fseek(fp, 0L, SEEK_SET);

        buf = (char*)malloc((size_t)size + 1);
        if(buf == NULL) {
                fclose(fp);
                return 2;
        }
        fread(buf, sizeof(char), (size_t)size, fp);
        fclose(fp);


        // найти указанную подстроку по-маске
        ptr = t_strstr(buf, search, &end);
        if(ptr != NULL) {
                // вывести всю подстроку
                puts(ptr);

                //вывести только выделенное значение по-маске
                for(; ptr != end; putchar(*ptr++));
        }


        // пример поискa всех подстрок по-маске
        ptr = buf;
        while((ptr = t_strstr(ptr, search, &end)) != NULL)
                for(putchar('\n'); ptr != end; putchar(*ptr++));

        free(buf);

        getchar();
        return 0;
}
Nuklon вне форума Ответить с цитированием
Старый 11.06.2013, 13:18   #5
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

спасибо за код Nuklon, но наличие не определяется если искомая строка:
?? ?? ?? 8A 06 46 88 07

, а текст для поиска:
00426000: 00 60 BE 00 40 44 00 8D BE 00 D0 FB FF C7 87 9C
00426010: 20 05 00 E6 0E 08 76 57 83 CD FF EB 0E 90 90 90
00426020: 90 8A 06 46 88 07 47 01 DB 75 07 8B 1E 83 EE FC
00426030: 11 DB 72 ED B8 01 00 00 00 01 DB 75 07 8B 1E 83
символы ?? подразумевают неизвестные данные (байт)
байты (символы) 8A 06 46 88 07 находит
Alexey_68 вне форума Ответить с цитированием
Старый 11.06.2013, 13:27   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Alexey_68, так Вы не говорили, что в файле еще и оффсет записан.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.06.2013, 14:21   #7
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

BDA, тип вывода в файл разный, для поиска можно без смещения хотя как это влияет?
Alexey_68 вне форума Ответить с цитированием
Старый 11.06.2013, 14:28   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Alexey_68 Посмотреть сообщение
тип вывода в файл разный, для поиска можно без смещения хотя как это влияет?
Ну раз разный, то нормально. Просто если в файле записаны смещения, то просто так искать подстроку не получится. Кстати, в файле без смещений все числа записаны подряд через пробел или на разных строчках (есть ли переносы строк)?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.06.2013, 14:43   #9
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

используется форматируемый вывод:
fprintf(out1, " %02X", buf[i]);
переносы через 16 байт:
00426000: 00 60 BE 00 40 44 00 8D BE 00 D0 FB FF C7 87 9C

Последний раз редактировалось Alexey_68; 11.06.2013 в 14:45.
Alexey_68 вне форума Ответить с цитированием
Старый 11.06.2013, 15:06   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Из-за наличия переносов код Nuklonа и не работает (что неудивительно, так как про переносы нельзя было догадаться по первоначальной постановке вопроса).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по маске Delphi Ztman Помощь студентам 2 28.10.2012 19:59
Поиск текста по маске WinApi Помощь студентам 6 27.12.2009 01:17
Поиск папки по маске ForzaJuve Общие вопросы Delphi 9 20.06.2009 23:50
Поиск По маске CoreFox Общие вопросы Delphi 11 21.02.2008 21:48