0

我想在 HTTP 标头中找到“\r\n\r\n”。我知道它在数据包的末尾,所以如果我反向搜索 "\r\n\r\n" 我会得到很好的性能。

是否有在 C 或 C++ 中实现反向搜索的函数?如果有,是哪一个?谢谢。

4

5 回答 5

12

反向搜索“\r\n\r\n”可能会给您错误的结果。这是不正确的逻辑,因为 HTTP 正文可能包含“\r\n\r\n”。

于 2012-09-05T04:08:46.220 回答
1

在 C++ 中,许多容器提供rbegin()rend(),它们实现了反向迭代。然后,您可以将这些交给任何标准算法。

例如,std::string::rbegin()std::string::rend()

于 2012-09-05T04:06:41.537 回答
0

试图这样做来解决您的问题是不正确的;如果您已经知道标头的长度,则无需搜索\r\n\r\n; 它位于长度的n-4位置。n如果您不知道长度,则从头开始计算长度与搜索\r\n\r\n.

话虽如此,如何进行“反转”的问题strstr还是memmem有效的。对于strstr,最佳方法是简单地重复调用 forward strstr,在起点使用前一个匹配加上一个字符,并保持找到的最后一次出现。对于memmem,您可以通过调整最佳正向算法以反向运行(基本上只是否定所有索引)来获得更好的性能。

于 2012-09-05T05:16:55.203 回答
0

就在这里。

假设headerstd::string

header.rfind( "\r\n\r\n" );
于 2012-09-05T05:58:05.043 回答
0

是的,有 - 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[]

于 2012-09-05T06:24:09.153 回答