C++ 转换为char*c+后丢失字符串数据+;
我目前正在学习如何使用libcurl开发HTTP代理。成功获得HTTP响应后,我将它们写入字符串,然后再使用回调函数进行进一步处理。在进一步的处理函数中,我首先需要将这些字符串转换为char*,这导致了一个丢失数据的问题,因为这些HTTP响应包含png和gif等图像数据。而其余的HTTP响应包含纯文本数据,如HTML和css,工作正常 我的问题是,为什么c_str()函数在转换过程中消除了像图像数据这样的不可读数据?有没有办法解决这个丢失数据的问题 代码: 字符*数据源C++ 转换为char*c+后丢失字符串数据+;,c++,string,type-conversion,C++,String,Type Conversion,我目前正在学习如何使用libcurl开发HTTP代理。成功获得HTTP响应后,我将它们写入字符串,然后再使用回调函数进行进一步处理。在进一步的处理函数中,我首先需要将这些字符串转换为char*,这导致了一个丢失数据的问题,因为这些HTTP响应包含png和gif等图像数据。而其余的HTTP响应包含纯文本数据,如HTML和css,工作正常 我的问题是,为什么c_str()函数在转换过程中消除了像图像数据这样的不可读数据?有没有办法解决这个丢失数据的问题 代码: 字符*数据源 void Client:
void Client::send(string msg)
{
sData_source_ = (char*)msg.c_str();
cout << "Your string is " << strlen(sData_source_)<<endl;
}
void客户端::发送(字符串消息)
{
sData_source_u=(char*)msg.c_str();
cout看起来您正试图将二进制文件视为字符串
<> >一旦遇到<代码> 0代码>代码>终止符,字符串将结束。请考虑以下内容:
const char* foo = "abc\012345667";
int length = strlen(foo);
长度
为3
,因为原始字符串在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;
}
}
大小数据长度;
无效客户端::发送(字符串消息)
{
sData_length=msg.size();
//为sData_源分配内存
sData_源=(字符*)malloc(sData_长度);
//将数据复制到sData_源
memcpy(sData_源,msg.data(),sData_长度);
//复制后比较数据
if(memcmp(sData\u源,msg.data(),sData\u长度)==0)
{
像gif和png这样的图像数据可以包含0
作为数据,而strlen
将其视为字符串的结尾null
终止符。你不应该依赖strlen()
来实现这一点,而应该单独跟踪数据字节。你显式转换为char*
是没有用的,c_str()
返回一个常量字符*
。除此之外,我正在投票,因为我非常好奇这个问题的答案。正如@Als提到的,你不能依赖strlen(),而不是使用msg
字符串的size
方法;此方法必须返回正确的大小;另一方面,如果您使用的是原始数据而不是字符。一个潜在的更大问题是,您正在存储指向本地对象的指针,当函数返回时,该指针将被销毁。您需要确保字符串在sData\u source\uuuu
的任何使用中都不会过期(或者将其更改为std::string
,或者重新构造代码以避免静态存储)。多亏了你们的注释,我解决了这个问题。是的,审美家。你的路线是正确的。因为我有时处理原始数据而不是字符,所以我需要使用数据()方法,而不是PaperBirdMaster在上述注释中提到的c_str()。