0

HTTP ストリームから画像を抽出しようとしています。libpcapパケットをキャプチャする場合を除き、C++ を使用する必要があり、他のライブラリは使用しません。これが私がやっていることです:

if ((tcp->th_flags & TH_ACK) != 0) {
                i = tcp->th_ack;
                const char *payload = (const char *) (packet + SIZE_ETHERNET + size_ip + size_tcp);
                size_payload = ntohs(ip->ip_len) - (size_ip + size_tcp);
                std::string temp(payload);
                dict.insert(std::pair<u_int,std::string>(tcp->th_ack,temp));
        }

そして、同じ ACK 番号を持つすべてのパケットを連結します。

 std::string ss;
 for(itt=dict.begin(); itt!= dict.end(); ++itt) {
                std::string temp((*itt).second);
                ss.append(temp);
  }
  std::ofstream file;
  file.open("image.jpg", std::ios::out | std::ios::binary)
  file << ss;
  file.close();

ファイルに書き込むssと、ファイルのサイズは送信された画像よりもはるかに小さくなります。これはバイナリ ファイルを書き込む正しい方法ですか?

私はC ++でこれをやろうとしています

4

1 に答える 1

1

std::string を使用すると、最初のヌル終了文字でデータが切り取られます (std::string がヌル終了文字列でない場合でも)。std::string のコンストラクターは char* を取り、null で終了する文字列を想定します。その証拠は次のとおりです。

char sample [] = {'a', 'b', '\0', 'c', 'd', '\0', 'e'};
std::string ss(sample);

代わりに std::vector を使用してデータを保存する必要があります。

于 2012-09-28T06:19:46.860 に答える