поиск последовательности бай в массиве

Тема в разделе "LANGS.C", создана пользователем BreakHeart, 19 ноя 2010.

  1. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    подскажите пожалуйста какой-нибу оптимальный алгоритм поиска последовательностей байт в массиве байтов.
    условия:
    есть массив байтов
    есть несколько последовательностей байтов, а также строки в юникоде которые можно предмтавить как последовательность байтов
    надо определить какая строка встречается в этом массиве
    строки длинные и все разных размеров
     
  2. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    BreakHeart
    Если база поиска конечна, то вполне пригоден конечный автомат АхоКорасик.
     
  3. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    а где можно его реализацию найти?конечна...максимум около 600 байт
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    что-то вроде такого. давно не брался за си, могут быть глюки и опечатки.
    Код (Text):
    1. UINT check(BYTE* array, BYTE** patterns, UINT patterns_count, UINT at)
    2. {
    3.   int l; for (i=0; array[l]; l++);
    4.   for (UINT i=at, i<patterns_count; i++)
    5.   {
    6.     UINT n, k; for (n=0; pattern[i][n]; n++);
    7.     if (l>=n)
    8.       for (UINT j=0; j<=l-n; j++)
    9.         for (k=0; k<l; k++)
    10.           if (pattern[i][j+k]!=array[k]) break;
    11.         if (k==l) return i;
    12.   }
    13.   return patterns_count;
    14. }
     
  5. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    BreakHeart,

    Глобально оптимального — не существует. Под какую архитектуру?
     
  6. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    могу предложить такое...)

    Код (Text):
    1. //////////////////////////////////////////////////////////////////////////
    2. BOOL utilsCompareData(const BYTE* pData, const BYTE* bMask, const char* pszMask)
    3. {
    4.     for(;*pszMask; ++pszMask, ++pData, ++bMask)
    5.         if(*pszMask == 'x' && *pData !=* bMask )
    6.             return FALSE;
    7.     return (*pszMask) == 0;
    8. }
    9.  
    10. //////////////////////////////////////////////////////////////////////////
    11. DWORD utilsFindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * pszMask)
    12. {
    13.     for(DWORD i=0; i < dwLen; i++)
    14.         if(utilsCompareData((BYTE*)( dwAddress+i ), bMask, pszMask ))
    15.             return (DWORD)(dwAddress + i);
    16.  
    17.     return 0;
    18. }
    юзать например так:
    target = utilsFindPattern(start_search, search_max, (BYTE*)"invalid sound %i", "xxxxxxxxxxxxxxxx");

    на месте каждого x можно поставить ? (или любой другой чар) - т.е. что этот байт неизвестен
     
  7. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    спасибо всем за примеры буду юзать