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

Losing string data after convert to char* c++

本文关键字:字符串 数据 c++ char 转换      更新时间:2023-10-16

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

IHDR��o�|d�IT pH��B�4.�tExt软件Macromedia Fireworks MX��*$tEXt创建时间12/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

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

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

const char* foo = "abc12345667";
int length = strlen(foo);

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

这是我修改代码后的解决方案,只是想与未来可能处理相同问题的其他人分享。

 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;
   }
}