我有一个混合的二进制文件(即图像)和一些人类可读的数据(即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);
}
现在假设带有人类可读文本的二进制数据位于您的(如前所述)名为 data
的std::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");