我想在 HTTP 标头中找到“\r\n\r\n”。我知道它在数据包的末尾,所以如果我反向搜索 "\r\n\r\n" 我会得到很好的性能。
是否有在 C 或 C++ 中实现反向搜索的函数?如果有,是哪一个?谢谢。
反向搜索“\r\n\r\n”可能会给您错误的结果。这是不正确的逻辑,因为 HTTP 正文可能包含“\r\n\r\n”。
在 C++ 中,许多容器提供rbegin()
和rend()
,它们实现了反向迭代。然后,您可以将这些交给任何标准算法。
试图这样做来解决您的问题是不正确的;如果您已经知道标头的长度,则无需搜索\r\n\r\n
; 它位于长度的n-4
位置。n
如果您不知道长度,则从头开始计算长度与搜索\r\n\r\n
.
话虽如此,如何进行“反转”的问题strstr
还是memmem
有效的。对于strstr
,最佳方法是简单地重复调用 forward strstr
,在起点使用前一个匹配加上一个字符,并保持找到的最后一次出现。对于memmem
,您可以通过调整最佳正向算法以反向运行(基本上只是否定所有索引)来获得更好的性能。
就在这里。
假设header
是std::string
:
header.rfind( "\r\n\r\n" );
是的,有 - std::find_end
。像这样使用:
string str = "abcabc";
string substr = "abc";
string::iterator ret =
std::find_end(str.begin(), str.end(), substr.begin(), substr.end());
if (ret == str.end()) cout << "not found\n";
else cout << "at: " << result - str.begin() << "\n";
另外,如果您正在搜索,std::string
则有std::string::rfind()
方法。std::find_end()
适用于任何容器,包括char[]