HTTPヘッダーで「\r\n\r\n」を見つけたいです。パケットの最後にあることがわかっているので、「\r\n\r\n」を逆検索すると、パフォーマンスが向上します。
C または C++ で逆検索を実装する関数はありますか? もしそうなら、どれですか?ありがとう。
「\r\n\r\n」を逆検索すると、間違った結果が得られる場合があります。HTTP ボディに「\r\n\r\n」が含まれている可能性があるため、正しいロジックではありません。
C++ では、コンテナーの多くが と を提供しrbegin()
ておりrend()
、反復を逆に実装しています。次に、これらを標準アルゴリズムのいずれかに渡すことができます。
はい、あります- 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[]
はいあります。
header
は次のとおりstd::string
です。
header.rfind( "\r\n\r\n" );
問題を解決するためにこれをしようとするのは正しくありません。ヘッダーの長さがすでにわかっている場合は、\r\n\r\n
;を検索する必要はありません。の長さのn-4
位置にありn
ます。長さが分からない場合、最初から長さを計算するには、\r\n\r\n
.
そうは言っても、「逆」を行う方法の問題は有効ですstrstr
。memmem
の場合strstr
、最適な方法は単純に forward を繰り返し呼び出し、strstr
前の一致に加えて開始点に 1 文字を使用し、最後に見つかった出現を維持することです。の場合memmem
、最適なフォワード アルゴリズムを逆方向に実行するように適応させることで (基本的にすべてのインデックスを否定するだけで)、はるかに優れたパフォーマンスを達成できます。