Я хочу найти «\ r \ n \ r \ n» в заголовке HTTP.
Я знаю, что это в конце пакета, поэтому, если я переверну поиск «\ r \ n \ r \ n», я получу хорошую производительность.
Есть ли функция, реализующая обратный поиск в C или C ++?
Если да, то какой?
Благодарю.
Обратный поиск «\ r \ n \ r \ n» может дать неверный результат. Это неверная логика, потому что тело HTTP может содержать «\ r \ n \ r \ n».
В C ++ многие из контейнеров предлагают rbegin()
а также rend()
, которые реализуют итерацию в обратном порядке. Затем вы можете передать их любому из стандартных алгоритмов.
Например, std::string::rbegin()
а также std::string::rend()
.
Попытка сделать это, чтобы решить вашу проблему, неверна; если вы уже знаете длину заголовка, то поиск для \r\n\r\n
; он расположен на n-4
положение где n
это длина. Если вы не знаете длину, то вычисление длины с начала занимает столько же времени, сколько и поиск \r\n\r\n
,
С учетом сказанного, вопрос, как сделать «обратный» strstr
или же memmem
является действительным. За strstr
Оптимальный метод — просто многократно вызывать форварда strstr
используя предыдущее совпадение плюс один символ в начальной точке и сохраняя последнее найденное вхождение. За memmem
Вы могли бы достичь гораздо большей производительности, адаптировав оптимальный алгоритм пересылки для запуска в обратном направлении (в основном просто сводя на нет все индексы).
Да, есть — 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" );