0

kad ネットワークへの接続を処理するライブラリを C++ で作成することになっています。aMule&co で使用されているものと一致するパケットを作成しようとしています。

そして、私はこのコードの違いを本当に理解できません:

buffer = "\xe4\x20\x02";

そして、例えば、このコード:

char p_buffer[36];
p_buffer[0] = 0xe4;
p_buffer[1] = 0x20;
p_buffer[2] = 0x02;

buffer = p_buffer;

(buffer はクラスのプライベート属性ですが、p_buffer はローカル変数です)

Wiresharkでパケットをキャプチャすると、リトルエンディアン/ビッグエンディアン表記で何か間違ったことをしていたように、さまざまな結果が得られます(最初のものは私が望んでいた通りで、2番目のものはそうではありません)。

クラスのコンストラクターで、[プライベート]「char *バッファー」を次のように変更できないのはなぜですか。

buffer[0] = 0xe4;

? (動作せず、トレースバックエラーなしで終了します)

(問題があれば、crypto++ と boost ライブラリを使用しています)

助けてくれてありがとう_

4

3 に答える 3

6

最初のコードサンプルは、おおよそ次のものと同等です。

static const char buffer_internal[4] = { 0xe4, 0x20, 0x02, 0x00 };
buffer = buffer_internal;

ここでの2つの違いは次のとおりです。

  • バッファはnullで終了します
  • バッファは変更できません。変更しようとするとクラッシュする可能性があります。

2番目のサンプルは、36バイトの変更可能なバッファーを割り当てます。ただし、上記のバッファは、スコープ外になると破棄されます。ここでは、解放された後に使用されないように注意してください。

3番目のサンプルについては、ポインタの場合、「バッファ」を初期化しましたか?エラーを実際に診断するのに十分な情報を提供していません。完全なクラス宣言とコンストラクターが役立ちます。

于 2009-08-10T14:25:16.443 に答える
2

""リテラルは、明示的な配列の長さ(この場合ではない)によって制約されない限り、暗黙的なNUL終了を持ちます。

また、2番目のケースでp_bufferは、はローカル変数、つまりスタックに割り当てられた自動変数であるため、その内容はゼロなどに初期化されませんが、基礎となるスタックメモリにあるジャンクが含まれます。

于 2009-08-10T14:26:14.960 に答える
2

単なる提案 - 既に Boost を使用している場合はboost::array、簡素化された固定長バッファー管理と、可変長バッファーの処理を検討してくださいboost::shared_array

于 2009-08-10T14:30:10.663 に答える