1

現在、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; 
}

出力: Sending HTTP Response[608]: FD:9 HTTP/1.1 200 OK Date: Wed, 29 Aug 2012 00:58:25 GMT Server: Apache/2.2.16 (Debian) Last-Modified: Tue, 28 Aug 2012 18 :34:36 GMT ETag: "13e4735-136-4c857b1b54700" Accept-Ranges: bytes Keep-Alive: timeout=15, max=99 Content-Type: image/png Content-Length: 310 Connection: keep-alive �PNG

IHDR��o�|d�IT pHYs���B�4� tEXtSoftwareMacromedia Fireworks MX�*$tEXtCreation Time12/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

4

2 に答える 2

3

バイナリ ファイルを文字列として処理しようとしているようです。

ターミネータが検出されるとすぐ\0に、文字列が終了します。次の点を考慮してください。

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

は、元の文字列が3 文字で終了しているためlengthです。3

于 2012-08-29T10:19:02.393 に答える
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;
   }
}
于 2012-08-30T09:01:10.760 に答える