1

我目前正在学习如何使用 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 OK 日期:2012 年 8 月 29 日星期三 00:58:25 GMT 服务器:Apache/2.2.16 (Debian) 最后修改时间:2012 年 8 月 28 日星期二 18 :34:36 GMT ETag:“13e4735-136-4c857b1b54700”接受范围:字节保持活动:超时 = 15,最大 = 99 内容类型:图像/PNG 内容长度:310 连接:保持活动 �PNG

IHDR.o.|d.IT pHYs..B.4. tEXtSoftwareMacromedia Fireworks MX.*$tEXtCreation Time12/06/04g.m.IDATx..1. E.u.r -.R).] X֚��w�<Ѱ�1F���������� tX��!�Z��=:$TJ��{�3�CRgb:$v4v�Cb��(��� B��!tH�L�[k�_wx8/:,@������ xQ�2]�|��IEND�B`� 你的字符串是 306

注意:正如你们可以从上面的输出中观察到的那样,最初的总 HTTP 响应是 608 字节。但是,使用 c_str() 函数转换后变为 306。

谢谢你,期待有人回复。:D

4

2 回答 2

3

看起来您试图将二进制文件视为字符串。

一旦\0遇到终止符,字符串就会结束。考虑以下:

const char* foo = "abc\012345667";
int length = strlen(foo);

length3因为原始字符串在3 个字符终止

于 2012-08-29T10:19:02.393 回答
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;
   }
}
于 2012-08-30T09:01:10.760 回答