【问题标题】:Use Flatbuffers to read data of previously written binary files使用 Flatbuffers 读取之前写入的二进制文件的数据
【发布时间】:2019-08-06 00:21:28
【问题描述】:

我有一个二进制文件,其中包含要加载到 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();
}

【问题讨论】:

  • 你能提供你的序列化代码吗?上面的代码看起来应该可以工作,假设 mmap 有正确的参数,我不知道我的头顶。此外,FlatBuffer 不是 unsigned int *,但这对于这种情况也无关紧要。
  • @Aardappel 我编辑了我的帖子并添加了写入数据的功能。此外, mmap 的所有标志似乎都可以。我还尝试将整个文件读入缓冲区(如 Flatbuffers 页面上的示例)并获得相同的输出。

标签: c++ flatbuffers


【解决方案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

【讨论】:

  • 所以如果我想加载一个包含多个字段的二进制文件,我需要先解析它,创建它的所有字段,然后创建一个 flatbuffer 对象?有没有办法将二进制文件传递给构建器并根据字段的大小创建结构?
  • 不确定你在问什么。如果有第二个字段,您只需将另一个参数添加到CreateSingle。接收端不需要“解析”。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2021-07-02
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多