Har*_*Boy 4 c++ boost http libcurl
我正在使用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 );
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能最好地用C ++做到这一点?我实际上如何检查并解析_data数组以获得所需的信息?我可以使用任何增强库吗?
您可以动态解析标头,也可以将标头放入地图中并在以后进行后期处理。用find,substr从方法的std :: string。查看Boost String Algorithms Library,它包含许多算法,例如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;
}
Run Code Online (Sandbox Code Playgroud)
您将获得输出:
KEY: `Content-Length`, VALUE: `19912`
KEY: `Content-Type`, VALUE: `image/jpeg; charset=utf-8`
Run Code Online (Sandbox Code Playgroud)
有了标题,您可以提取所需的标题以进行后处理。