Как искать в массиве BYTE шаблон? - PullRequest
9 голосов
/ 06 сентября 2011

У меня есть массив байтов:

1002 *BYTE Buffer[20000]; этот массив содержит следующие данные:

00FFFFFFFFFFFF0010AC4C4053433442341401030A2F1E78EEEE95A3544C99260F5054A54B00714F8180B3000101010101010101010121399030621A274068B03600DA281100001C000000FF003457314D44304353423443530A000000FC0044454C4C2050323231300A2020000000FD00384B1E5310000A20202020202000FA

Мой вопрос, как яискать в этом массиве шаблон типа "000000FC"?Я не думаю, что это важно, но мне нужен индекс, где я тоже могу найти свой паттерн.Может ли кто-нибудь привести пример для этого, потому что я не очень понимаю это: (

Ответы [ 3 ]

24 голосов
/ 06 сентября 2011

Поскольку вы находитесь в C ++, сделайте это C ++:

char a[] = { 0, 0, 0, 0xFC };
char Buffer[20000] = ...

std::string needle(a, a + 4);
std::string haystack(Buffer, Buffer + 20000);  // or "+ sizeof Buffer"

std::size_t n = haystack.find(needle);

if (n == std::string::npos)
{
    // not found
}
else
{
    // position is n
}

Вы также можете использовать алгоритм для прямого поиска в массиве:

#include <algorithm>
#include <iterator>

auto it = std::search(
    std::begin(Buffer), std::end(Buffer),
    std::begin(a), std::end(a));

if (it == std::end(Buffer))
{
    // not found
}
else
{
    // subrange found at std::distance(std::begin(Buffer), it)
}

Или, в C ++ 17, вы можете использовать строковое представление:

std::string_view sv(std::begin(Buffer), std::end(Buffer));

if (std::size_t n = sv.find(needle); n != sv.npos)
{
    // found at position n
}
else
{
    // not found
}
7 голосов
/ 06 сентября 2011

Вы хотите что-то вроде memmem (этот код лицензирован по лицензии GPL).

Тем не менее, это не должно быть сложно свернуть свой собственный.Как и в реализации memmem, вам нужен цикл, который использует memchr, чтобы найти первый символ вашей иглы в стоге сена, и memcmp, чтобы проверить каждое попаданиеи посмотри, все ли твои иглы там.

2 голосов
/ 13 сентября 2017

Попробуйте, просто нужно:

// Returns a pointer to the first byte of needle inside haystack, 
static uint8_t* bytes_find(uint8_t* haystack, size_t haystackLen, uint8_t* needle, size_t needleLen) {
    if (needleLen > haystackLen) {
        return false;
    }
    uint8_t* match = memchr(haystack, needle[0], haystackLen);
    if (match != NULL) {
        size_t remaining = haystackLen - ((uint8_t*)match - haystack);
        if (needleLen <= remaining) {
            if (memcmp(match, needle, needleLen) == 0) {
                return match;
            }
        }
    }
    return NULL;
}
...