如何在BYTE数组中search模式?

我有一个字节数组:

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

00FFFFFFFFFFFF0010AC4C4053433442341401030A2F1E78EEEE95A3544C99260F5054A54B00714F8180B3000101010101010101010121399030621A274068B03600DA281100001C000000FF003457314D44304353423443530A000000FC0044454C4C2050323231300A2020000000FD00384B1E5310000A20202020202000FA

我的问题是如何search这个数组像“ 000000FC ”模式? 我真的不认为这很重要,但我需要的索引,我可以find我的模式了。 有人可以提供一个这样的例子,因为我不明白这:(

由于你使用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 } 

你想要的东西像memmem (该代码是与GPL授权的)。

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

试试这个,只需要它:

 // 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; }