如何在BYTE数组中搜索模式?

kam*_*mpi 9 c c++ windows pattern-matching

我有一个字节数组:

BYTE Buffer[20000]; 此数组包含以下数据:

00FFFFFFFFFFFF0010AC4C4053433442341401030A2F1E78EEEE95A3544C99260F5054A54B00714F8180B3000101010101010101010121399030621A274068B03600DA281100001C000000FF003457314D44304353423443530A000000FC0044454C4C2050323231300A2020000000FD00384B1E5310000A20202020202000FA

我的问题是如何在这个数组中搜索像" 000000FC" 这样的模式?我真的不认为它很重要,但我需要索引,我也可以找到我的模式.有人可以为此提供一个例子,因为我真的不明白这个:(

Ker*_* SB 24

既然你是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
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用算法直接搜索数组:

#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)
}
Run Code Online (Sandbox Code Playgroud)

或者,在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
}
Run Code Online (Sandbox Code Playgroud)

  • 由于涉及复制,我对解决方案感到失望,特别是因为演示中的大小是“20000”:( (2认同)
  • @保罗:很好,谢谢。那时我还不知道 C++。我添加了一些其他选项。 (2认同)
  • @BrandonL:当然,也许,有时。衡量并选择。有时,简单的解决方案也有价值,即使它可能没有最佳性能。 (2认同)

Jon*_*Jon 7

你想要的东西memmem(代码是通过GPL许可的).

但是,推出自己的应该不难.就像在memmem实现中一样,你需要一个循环,用于memchr在大海捞针中找到针的第一个字符,并memcmp测试每个命中,看看你的所有针都在那里.

  • 您可能想要的一切以及更多:http://igm.univ-mlv.fr/~lecroq/string/ (3认同)