バイナリリクエストを作成して記述しようとしていますが、「これは可能ですか」というタイプの質問があります。リクエストの受信者は、以下に含めたデータ構造を認識していないことに言及することが重要かもしれません。これは、バイトのシーケンスを想定しているだけですが、構造体を使用すると、リクエストの一部を準備するための便利な方法のように見えました。その後、それらを簡単に記述します。
ヘッダーとフッターは固定サイズなので書き込みは問題ありませんが、ベクトルが原因で構造体「詳細」で問題が発生しています。今のところ、リクエストを確認できるようにファイルに書き込んでいるのは仕様ですが、最終的にはブーストasioシリアルポートを使用してPLCに書き込むことを目的としています。
このような構文を使用して構造体を記述できますが、ベクトルに到達すると、値ではなくポインターアドレスが書き込まれます。
myFile.write((char*) &myDataRequest, drSize);
この構文を使用してベクトルを単独で書き込むことはできますが、値を書き込むには0にインデクサーを含める必要があります
myFile.write((char*) &myVector[0], vectorSize);
ベクトル(または他の適切なコレクション)を含む構造体を一度にバイナリ書き込みするエレガントな方法はありますか?たとえば、ベクトルを別の方法で宣言した場合や、構造体内のコンテンツに対して複数の書き込みを行うことを辞任した場合などです。ベクトルを配列に置き換えると、構造体を一度に送信できますが(インデクサーを含める必要はありません)、実行時まで必要なサイズがわからないため、適切ではないと思います。
私の構造
struct Header
{ ... };
struct Details
{
std::vector<DataRequest> DRList;
};
struct DataRequest
{
short numAddresses; // Number of operands to be read Bytes 0-1
unsigned char operandType; // Byte 2
unsigned char Reserved1; //Should be 0xFF Byte 3
std::vector<short> addressList; // either, starting address (for sequence), or a list of addresses (for non-sequential)
};
struct Footer
{ ... };