Получение sizeOf (таблица плоских буферов)

Я использую Flatbuffers с C ++. Я хотел бы создать массив байтов в структуре, которая является размером сгенерированной таблицы (я отправляю содержимое в качестве полезной нагрузки для сообщения NanoMSG).

Как сделать sizeof (table)?

#include "pnt_generated.h"

struct packetStruct {
    Topics topic;
    int payloadSize;
    uint8_t payload[sizeof(pnt)];
};

не работает напрямую.


person Dr.YSG    schedule 20.07.2018    source источник
comment
Возможно, здесь есть информация об этом groups.google.com/forum/#!topic / flatbuffers / 7wuLsfjI3u8   -  person jspcal    schedule 20.07.2018
comment
В C ++ нельзя объявлять массивы переменного размера (FlatBuffer не является заранее известным фиксированным размером). Обратите внимание, что вы можете создавать буферы с префиксом размера в FlatBuffers. Поэтому вместо того, чтобы пытаться обернуть FlatBuffer в свою собственную структуру, вы можете использовать FlatBuffers для всего этого.   -  person Aardappel    schedule 20.07.2018
comment
@Aardappel Мне нужно обернуть его в пакет, так как я использую вариант ZeroMQ для публикации в сети, а первые байты пакета - это канал / тема. Остальное - это полезная нагрузка - Flatbuffers.   -  person Dr.YSG    schedule 20.07.2018
comment
может зарезервировать std :: vector вместо массива .. struct packet {Topics topic; int pSize; полезная нагрузка std :: vector ‹uint8› (sizeof (pnt)); }   -  person Shivendra Agarwal    schedule 23.07.2018
comment
Это не помогает получить непрерывный блок памяти с темой канала в качестве первых байтов.   -  person Dr.YSG    schedule 23.07.2018
comment
Что ж, похоже, ни у кого нет лучшей идеи для меня использовать фиксированный размер #define PayloadMax 256, затем декларировать полезную нагрузку как uint_t [PayloadMax] и проверять в конструкторе, если я превысил размер, который я не ожидал больше 256, я не думаю, что это будет проблемой. И я отправляю только текущий размер (int payloadsize), так что может пострадать?   -  person Dr.YSG    schedule 23.07.2018


Ответы (2)


Поскольку кажется, что Flatbuffers динамически устанавливает размер (в моем случае полезной нагрузки). И никто не знает лучше, я создаю полезную нагрузку фиксированного размера в структуре, а затем проверяю, превышаю ли я это:

#define PayloadMax 256
#include "pnt_generated.h"

struct packetStruct {
    Topics topic;
    int payloadSize;
    uint8_t payload[PayloadMax];
};
person Dr.YSG    schedule 25.07.2018

Вы можете получить размер вашей полезной нагрузки из буфера: flatbuffers::FlatBufferBuilder builder(1024);
auto l = CreateLogEvent(builder, builder.CreateString("INFO"), builder.CreateString("main.c"), builder.CreateString("Test Log Entry")); FinishLogEventBuffer(builder, l); auto ptr = builder.GetBufferPointer(); auto size = builder.GetSize();

person Davin Thompson    schedule 20.01.2019