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

はい、あります- 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 に答える
0

はいあります。

headerは次のとおりstd::stringです。

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

問題を解決するためにこれをしようとするのは正しくありません。ヘッダーの長さがすでにわかっている場合は、\r\n\r\n;を検索する必要はありません。の長さのn-4位置にありnます。長さが分からない場合、最初から長さを計算するには、\r\n\r\n.

そうは言っても、「逆」を行う方法の問題は有効ですstrstrmemmemの場合strstr、最適な方法は単純に forward を繰り返し呼び出し、strstr前の一致に加えて開始点に 1 文字を使用し、最後に見つかった出現を維持することです。の場合memmem、最適なフォワード アルゴリズムを逆方向に実行するように適応させることで (基本的にすべてのインデックスを否定するだけで)、はるかに優れたパフォーマンスを達成できます。

于 2012-09-05T05:16:55.203 に答える