【问题标题】:Losing string data after convert to char* c++转换为char * c ++后丢失字符串数据
【发布时间】:2012-08-29 10:12:12
【问题描述】:

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

IHDR�o�|d�IT pHYs Ø “B�4” tEXtSoftwareMacromedia Fireworks MX��*$tEXtCreation Time12/06/04g�m�IDATx���1�E�u��r -�R)�]X֚��w�

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

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

【问题讨论】:

  • gifpng 这样的图像数据可以包含 0 作为 strlen 视为字符串结尾的数据 null terminator.You不应该依赖strlen(),而是应该单独跟踪数据字节。
  • 您对char * 的显式转换是没有用的,c_str() 返回一个const char *。除此之外,我很高兴看到这个问题的答案。
  • 正如@Als 所述,您不能依赖strlen(),而是使用msg 字符串的size 方法;此方法必须返回正确的大小;另一方面,如果您使用的是原始数据而不是字符,use the data() method instead of the c_str() mehtod
  • 一个可能更大的问题是您存储了一个指向本地对象的指针,该指针将在函数返回时被销毁。您需要确保该字符串的使用时间超过 sData_source_ 的任何使用(或将其更改为 std::string,或重组您的代码以避免静态存储)。
  • 感谢你们的cmets,我解决了这个问题。

标签: c++ string type-conversion


【解决方案1】:

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

只要遇到\0 终止符,字符串就会结束。考虑以下几点:

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

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

【讨论】:

  • 是的,美学家。你是正确的路线事业。由于我有时处理原始数据而不是字符,因此我需要使用 data() 方法而不是上面 cmets 中 PaperBirdMaster 提到的 c_str() 方法。
【解决方案2】:

这是我修改代码后的解决方案,只是想与将来可能会遇到同样问题的人分享。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 2013-05-13
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多