我正在使用curl 与服务器通信。
当我发出数据请求时,我收到 HTTP 标头,后跟由边界分隔的 jpeg 数据,如下所示:
我需要解析出
- 边界字符串
- 内容长度。
我已将传入数据复制到 char 数组,如下所示:
static size_t OnReceiveData ( void * pvData, size_t tSize, size_t tCount, void * pvUser )
{
printf("%*.*s", tSize * tCount, tSize * tCount, pvData);
char* _data;
if(pvData != nullptr && 0 != tCount)
{
_data = new char[tCount];
memcpy(_data, pvData, tCount);
}
return ( tCount );
}
我怎样才能最好地在 C++ 中做到这一点?我如何实际检查和解析 _data 数组以获得我想要的信息?例如,我可以使用任何 boost 库吗?
您可以即时解析标头或将它们放入映射中并稍后进行后处理。
使用find
, substr
方法来自标准::字符串 http://en.cppreference.com/w/cpp/string/basic_string。
看着Boost 字符串算法库 http://www.boost.org/doc/libs/1_56_0/doc/html/string_algo.html,它包含很多算法,例如trim
例如将标题放入std::map
并打印它们(粗剪):
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <boost/algorithm/string.hpp>
int main(int argc, char* argv[]) {
const char* s = "HTTP/1.1 200 OK\r\n"
"Content-Type: image/jpeg; charset=utf-8\r\n"
"Content-Length: 19912\r\n\r\n";
std::map<std::string, std::string> m;
std::istringstream resp(s);
std::string header;
std::string::size_type index;
while (std::getline(resp, header) && header != "\r") {
index = header.find(':', 0);
if(index != std::string::npos) {
m.insert(std::make_pair(
boost::algorithm::trim_copy(header.substr(0, index)),
boost::algorithm::trim_copy(header.substr(index + 1))
));
}
}
for(auto& kv: m) {
std::cout << "KEY: `" << kv.first << "`, VALUE: `" << kv.second << '`' << std::endl;
}
return EXIT_SUCCESS;
}
您将得到输出:
KEY: `Content-Length`, VALUE: `19912`
KEY: `Content-Type`, VALUE: `image/jpeg; charset=utf-8`
有了标头,您就可以提取所需的标头进行后处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)