1

unsigned char && unsigned char の長さを取得する関数で、

void pcap_callback(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet) 
{
    std::vector<unsigned char> vec(packet, packet+pkthdr->len); // optimized from foo.
    std::stringstream scp;
    for (int i=0;i<pkthdr->len;i++) {
        scp<<vec[i];
    }
    std::string mystr =  std::string(scp.rdbuf()->str());
    std::cout << "WAS: " << packet << std::endl;
    std::cout << "GOOD: " << scp.str() << std::endl;
    std::cout << "BAD: "  << scp.str().c_str() << std::endl;
    std::cout << "TEST: " << mystr.size() << std::endl;
    assert(mystr.size() == pkthdr->len); 
}

結果:

  • WAS: 何も出力しません (const.. case へのポインタがあると思います)
  • GOOD:印刷データ
  • 悪い: 何も印刷しない
  • テスト、アサート: mystr.size() が渡された unsigned char サイズと等しいことを出力します。

私は試した:

  • string.assign(scp.rdbuf());
  • memcpy(文字、scp.str()、10);
  • 一時的な文字、文字列を作成/割り当てるさまざまな方法

助けはありません..データを含むstd ::cout 'able std::stringを取得する必要があります(パケットデータであるunsigned charであるfooから選択されました)。

元のfooがヌルで終了していない可能性があるか、問題は次のようなものであると推測します-単純ですが、入ることができません..ここで探すべきものは何ですか?

(このコードは、libpcapp のような既知の C++ マジック ラッパーを使用せずに、C++ の方法でパケットを出力するためだけに、libpcap を使用する別の試みです)。

4

3 に答える 3

3

簡単なテストとして、文字列に '\0' 文字が埋め込まれているかどうかを確認するためのチェックを投げscp.str().size() == strlen(scp.str().c_str())ます。これが起こっていると思われます。

于 2010-12-02T20:13:16.443 に答える
2

私はあなたがこれについて間違った方法で行っていると思います。ここではバイナリ データを扱っているように見えますが、その場合、それを意味のあるテキストとして画面に出力することは期待できません。本当に必要なのはhex dumpです。

const unsigned char* ucopy = packet;
std::ios_base::fmtflags old_flags = std::cout.flags();
std::cout.setf(std::ios::hex, std::ios::basefield);

for (const unsigned char* p = ucopy, *e = p + pkthdr->len; p != e; ++p) {
    std::cout << std::setw(2) << std::setfill('0') << static_cast<unsigned>(*p) << " ";
}

std::cout.flags(old_flags);

これにより、データがバイト単位で出力され、バイナリ データの個々の 16 進数値を調べることができます。null バイトは単純に として出力され00ます。

于 2010-12-02T20:16:56.863 に答える
1

std::cout.good()失敗した出力試行後に確認してください。私の推測では、出力に何らかの失敗 (つまり、印刷できない文字をコンソールに書き込もうとしている) があり、これは on に設定failbitされていcoutます。

また、文字列が で始まっていないことを確認してくださいNULL。これにより、空の出力が予期される動作になります:)

(ちなみに、C++ を使用している場合はreinterpret_castforを使用してください ;))unsigned char *ucopy = (unsigned char*)packet;

于 2010-12-02T20:04:18.800 に答える