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