私は 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.