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

新手上路,请多包涵

我有一个字节数组:

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

00FFFFFFFFFFFF0010AC4C4053433442341401030A2F1E78EEEE95A3544C99260F5054A54B00714F8180B3000101010101010101010121399030621A274068B03600DA281100001C000000FF003457314D44304353423443530A000000FC0044454C4C2050323231300A2020000000FD00384B1E5310000A20202020202000FA

我的问题是如何在这个数组中搜索“ 000000FC ”这样的模式?我真的不认为这很重要,但我也需要可以找到我的模式的索引。

原文由 kampi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 886
2 个回答

由于您使用的是 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
}

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 3.0 许可协议

您想要 memmem 类的东西(该代码已获得 GPL 许可)。

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

原文由 Jon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题