Используйте Flatbuffers для чтения данных ранее записанных двоичных файлов.

У меня есть двоичный файл, содержащий данные, которые я хочу загрузить в объект Flatbuffer. В качестве игрушечного примера я использую следующую схему:

namespace SingleInt;
table Single{
    value:uint32;
}
root_type Single;

Учтите, что мой бинарный файл содержит именно эту информацию: значение unsigned int и ничего больше. В этом случае я сохранил значение 5 в своем файле. Я пытаюсь назначить и отобразить содержимое моего двоичного файла в свой объект Flatbuffer, используя следующий метод:

void readFbs(){
    int fd = open("myfile", O_RDONLY, 0);
    unsigned int* memmap = (unsigned int*)mmap(0, sizeof(unsigned int), PROT_READ, MAP_SHARED, fd, 0);
    auto myfile = SingleInt::GetSingle(memmap);
    std::cout<<myfile->value()<<std::endl;
}

На выходе получается значение 0 вместо значения 5, которое, как я думал, я получу.

Мой вопрос: зная, как был сериализован и написан двоичный файл, если я создам схему, которая его представляет, можно ли загрузить его содержимое в объект Flatbuffer?

Изменить: функция для записи данных

void writebin(){
    unsigned int var = 5;
    std::ofstream OutFile;
    OutFile.open("myfile", std::ios::out | std::ios::binary);
    OutFile.write(reinterpret_cast<char*>(&var), sizeof(var));
    OutFile.close();
}

person woz    schedule 06.08.2019    source источник
comment
Можете ли вы также предоставить свой код сериализации? Вышеприведенный код выглядит так, как будто он должен работать, при условии, что mmap имеет правильные параметры, которые я не знаю сразу. Кроме того, FlatBuffer не является unsigned int *, но в данном случае это тоже не имеет значения.   -  person Aardappel    schedule 06.08.2019
comment
@Aardappel Я отредактировал свой пост и добавил функцию для записи данных. Кроме того, все флаги для mmap выглядят нормально. Я также попытался прочитать весь файл в буфер (как пример на странице Flatbuffers) и получил тот же результат.   -  person woz    schedule 06.08.2019


Ответы (1)


Ваш программный код просто записывает голый int в файл. Вместо этого вам нужно использовать функции FlatBuffers, чтобы написать что-то, совместимое с форматом FlatBuffers, например.

FlatBufferBuilder fbb;
fbb.Finish(CreateSingle(fbb, 5));
// Now write the buffer starting at fbb.GetBufferPointer() for fbb.GetSize() to a file.

Дополнительные сведения см. на странице https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html.

person Aardappel    schedule 06.08.2019
comment
Итак, если я хочу загрузить двоичный файл с несколькими полями, мне нужно сначала проанализировать его, создать все его поля, а затем создать объект flatbuffer? Нет ли способа передать бинарный файл компоновщику, и он создаст структуру в соответствии с размером полей? - person woz; 06.08.2019
comment
Не уверен, что вы спрашиваете. Если бы было второе поле, вы бы просто добавили еще один параметр в CreateSingle. На принимающей стороне синтаксический анализ не требуется. - person Aardappel; 06.08.2019