如何在容器"std::vector<char>"查找单个单词



我有一个混合的二进制文件(即图像)和一些人类可读的数据(即HTTP头)存储在"std::vector<char>"容器中。(数据由"CRLFCRLF (\r\r)"指示符分隔)

谁能建议如何在"std::vector<char>"容器中找到"\r\r"的起始位置?

是否可以使用 STL 库执行类似"std::size_t pos = data.find("rnrn");(其中数据是"std::vector<char>")"之类的操作?

谢谢。

您不需要将要查找的模式放入容器中。一个 C 字符串就足够了。

std::vector<char> v = ....;
const char *crlf2 = "rnrn";
auto it = std::search(v.begin(), v.end(), crlf2, crlf2 + strlen(crlf2));

无论如何,在此之后,it将包含一个迭代器到该模式开始的向量v(如果未找到该模式,则v.end())。

您可以将其转换为包含std::distance(v.begin(), it)或仅it - v.begin()的索引

可以使用std::search搜索感兴趣的字符序列的第一次出现。您必须将该序列放在数组或容器中。

std::vector<char> v = ....;
std::vector<char> start{'r', 'n', 'r', 'n'};
auto it = std::search(v.begin(), v.end(), start.begin(), start.end());
// As mentioned, you can use a basic C-style string.
// But, for convenience, an array works just as well
// Using an array allows for us to use std::begin() and std::end()
static constexpr const char DOUBLE_CLRF[]{'r','n','r','n'};
/**
 <summary>        Finds the first occurrence of "rnrn".   </summary>
 <param name="v"> Contains the char data you want to process. </param>
 <returns>        The position of the first "rnrn".       </returns>
 */
ptrdiff_t findFirstDoubleClrf(const std::vector<char>& v) {
    const auto it = std::search(v.begin(), v.end(), std::begin(DOUBLE_CLRF), std::end(DOUBLE_CLRF));
    return std::distance(v.begin(), it);
}
/**
 <summary>        Finds the last occurrence of "rnrn".    </summary>
 <param name="v"> Contains the char data you want to process. </param>
 <returns>        The position of the last "rnrn".        </returns>
 */
ptrdiff_t findLastDoubleClrf(const std::vector<char>& v) {
    const auto it = std::find_end(v.begin(), v.end(), std::begin(DOUBLE_CLRF), std::end(DOUBLE_CLRF));
    return std::distance(v.begin(), it);
}

现在假设带有人类可读文本的二进制数据位于您的(如前所述)名为 datastd::vector<char>中。

// To get the *first* match
auto pos = findFirstDoubleClrf(data);
// To get the *last* match
auto lastPos = findLastDoubleClrf(data);
// Note: std::distance returns a signed value rather than unsigned (e.g. size_t)
// You can, of course, static_cast<size_t>(pos) if desired.

但是,如果您错过了std::string提供find()方法,并且您有 C++17 可用方法,则可以在不复制整个std::vector<char>的情况下使用std::string_view以提供类似的功能。

std::string_view sv(&data[0], data.size());
auto pos = sv.find("rnrn");
auto lastPos = sv.rfind("rnrn");

最新更新