我有一个混合二进制文件(即图像)和一些存储在“std::vector<char>
”容器中的人类可读数据(即HTTP标头)。
(数据由“CRLFCRLF(\ r \ n \ r \ n)”指示符分隔
有人可以建议如何在“std::vector<char>
”容器中找到“ \ r \ n \ r \ n ”的开始位置?
是否可以使用“std::size_t pos = data.find("\r\n\r\n");
(数据为”std::vector<char>
“)”使用STL库?
感谢。
答案 0 :(得分:5)
您无需将正在寻找的模式放入容器中。一个C字符串就足够了。
std::vector<char> v = ....;
const char *crlf2 = "\r\n\r\n";
auto it = std::search(v.begin(), v.end(), crlf2, crlf2 + strlen(crlf2));
无论如何,在此之后,it
将在该模式开始的向量v
中包含一个迭代器(如果未找到该模式,则为v.end()
)。
您可以将其转换为std::distance(v.begin(), it)
或it - v.begin()
答案 1 :(得分:4)
您可以使用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());
答案 2 :(得分:0)
// 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 "\r\n\r\n". </summary>
<param name="v"> Contains the char data you want to process. </param>
<returns> The position of the first "\r\n\r\n". </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 "\r\n\r\n". </summary>
<param name="v"> Contains the char data you want to process. </param>
<returns> The position of the last "\r\n\r\n". </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);
}
现在,假设您的std::vector<char>
名为data
的二进制数据位于您的// 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.
中。
find()
但是但是,如果您错过了std::string
提供的std::string_view
方法,并且可以使用C ++ 17,则可以使用std::vector<char>
而无需复制整个std::string_view sv(&data[0], data.size());
auto pos = sv.find("\r\n\r\n");
auto lastPos = sv.rfind("\r\n\r\n");
提供类似的功能。
()