0

私は std::vector を使用して、ファイルから読み取ったバイナリ データを保存し、ソケット経由で送信されるデータ グラムにシリアル化します。エンド ツー エンド機能の単体テストを作成しましたが、予期しない理由で失敗しました。

std::vector<char> buf;
response->data(buf);
ASSERT(1 == buf.size());

アイデアは、1バイトを転送して1バイトを受信することでした。私が実際に得たのは4バイトでした。

基本的に、エンコードとデコードの両方で使用される挿入イベントによって、ベクトルのサイズが bufsize * 2 バイトまたは文字に変更されました。これはドキュメントのどこにもありませんでした。

unsigned long sourceLen = 1;
char source[] = { '0' };

...

std::vector<char> buf;
buf.resize(sourceLen);
buf.insert(buf.begin(), source, source + sourceLen);
ASSERT(1 == buf.size());  // Fails: buf.size() == 2.

これは、decode メソッドの受信側で再び発生し、4 バイトのバッファーになります。insert メソッドを使用せず、代わりに C スタイルのループを実装することで問題を解決しました。

buf.resize(sourceLen);
for (unsigned long i = 0; i < sourceLen; ++)
{
    buf[i] = source[i];
}
ASSERT(1 == buf.size());  // Succeeds: buf.size() == 1.

では、なぜ insert はベクターのサイズを変更して、最初よりも多くのデータが得られるようにするのでしょうか? ああ、私はこれを試しましたが、バッファサイズの問題は解決しましたが、データがコピーされませんでした:

buf.resize(sourceLen);
buf.insert(buf.begin(), data, data + dataLen - 1);

ASSERT(1 == buf.size());  // Succeeds: buf.size() == 1.
ASSERT(buf[0] == source[0]);  // Fails: buf[0] == ''.

いつものように、質問を送信した後に考えました。挿入が現在の内容を保持し、新しい値を挿入している場合ですか? つまり、ベクターのサイズ変更は、insert を呼び出す前に 0 バイトにサイズ変更する必要がありますか?

アップデート:

ドキュメントでこれを見逃しました...

The vector is extended by inserting new elements before the element at the specified position, effectively increasing the container size by the number of elements inserted.
4

1 に答える 1