我目前正在学习如何使用libcurl开发HTTP代理。在我成功获得HTTP响应后,我在使用回调函数进行进一步处理之前将它们写入字符串。在进一步的过程函数中,我需要首先将这些字符串转换为char *,这导致丢失数据问题,因为那些HTTP响应包含像png和gif这样的图像数据。其余的HTTP响应包含像HTML和CSS这样的纯文本数据工作正常。
我的查询和问题是为什么c_str()函数在转换期间消除了那些不可读的数据,如图像数据?有没有办法解决这个丢失的数据问题?
代码: char * sData_source_;
void Client::send(string msg)
{
sData_source_ = (char*)msg.c_str();
cout << "Your string is " << strlen(sData_source_)<<endl;
}
输出: 发送HTTP响应[608]: FD:9 HTTP / 1.1 200好的 日期:2012年8月29日星期三00:58:25 GMT 服务器:Apache / 2.2.16(Debian) 最后修改时间:2012年8月28日星期二18:34:36 GMT ETag:“13e4735-136-4c857b1b54700” Accept-Ranges:字节 Keep-Alive:超时= 15,最大= 99 内容类型:image / png 内容长度:310 连接:保持活力 PNG
IHDR o |d ITpHY B 4 tEXtSoftwareMacromediaFireworksMX * $ tEXtCreation Time12 / 06 /04g m IDATx 1 E u r - R) ]X֚ w &lt;Ѱ 1F tX ! Z =:$TJ { 3 CRgb:$v4v Cb !(B THL [k_wx8 /:@ XQ2] | IENDB` 你的字符串是306
注意:正如你们可以从上面的输出中观察到的那样,总的HTTP响应最初是608字节。但是,使用c_str()函数转换后它变为306。
谢谢你,期待有人回复。 :d
答案 0 :(得分:3)
看起来你试图将二进制文件视为字符串。
遇到\0
终结符时,字符串将结束。请考虑以下事项:
const char* foo = "abc\012345667";
int length = strlen(foo);
length
为3
,因为 3个字符后原始字符串已终止。
答案 1 :(得分:0)
以下是修改我的代码后的解决方案,只是想与将来可能会处理相同问题的其他人分享。
size_t SData_length;
void Client::send(string msg)
{
sData_length = msg.size();
// allocate memory for sData_source
sData_source_ = (char*)malloc(sData_length);
// copy data to sData_source
memcpy(sData_source_, msg.data(), sData_length);
// compare data after copy
if(memcmp(sData_source_, msg.data(), sData_length) == 0)
{
cout<<"Copy Data Succeed"<<endl;
}
}