Я пытаюсь создать и написать двоичный запрос и задать вопрос типа «возможно ли это». Для меня может быть важно упомянуть, что получатель запроса не знает о структуре данных, которую я включил ниже, он просто ожидает последовательность байтов, но использование структуры показалось удобным способом подготовить части запроса, тогда легко напишите их.
Написание верхнего и нижнего колонтитула в порядке, поскольку они имеют фиксированный размер, но у меня возникают проблемы со структурой «Подробности» из-за вектора. На данный момент я пишу в файл, поэтому я могу проверить, что запрос соответствует спецификации, но намерение состоит в том, чтобы в конечном итоге записать в ПЛК, используя последовательный порт boost asio.
Я могу использовать такой синтаксис, чтобы написать структуру, но она записывает адреса указателей, а не значения, когда попадает в вектор.
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
{ ... };