转换为char * c ++后丢失字符串数据

时间:2012-08-29 10:12:13

标签: c++ string type-conversion

我目前正在学习如何使用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

2 个答案:

答案 0 :(得分:3)

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

遇到\0终结符时,字符串将结束。请考虑以下事项:

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

length3,因为 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;
   }
}