c++ - flatbuffer c++:是否有可能从 flatbuffers::Vector 窃取

标签 c++ flatbuffers

我是 flatbuffer 的新手,我想知道是否可以完全(不是 const*)访问 flatbuffers::Vector 中的数据。看看下面的例子,我想窃取 img2::mem::data 的所有权,将其存储在 Img-struct 中,并以我想要的任何方式处理它.如果没有 memcopy-ing,这在某种程度上是可能的吗?

    struct Img
    {
        int iXCount;
        int iYCount;
        int iXOffset;
        unsigned char *mem;
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
        Img img;
        //init img;

        flatbuffers::FlatBufferBuilder fbb;

        auto mem = fbb.CreateVector(img.mem, img.iXOffset * img.iYCount);
        auto mloc = CreateImage(fbb, img.iXCount, img.iYCount, img.iXOffset, mem);

        fbb.Finish(mloc);

        //unpack
        auto img2 = flatbuffers::GetRoot<Image>(fbb.GetBufferPointer());
        const std::uint8_t*pMem = img2->mem()->data(); //unfortunately only const*

        return 0;
    }

最佳答案

您的 pMem 指向位于您正在使用的 FlatBuffer 中间某处的数据。所以这意味着您可以访问它,但前提是您可以保留父缓冲区。

由于这些是字节,您可以对它们进行常量转换,并在不复制的情况下就地修改它们。请注意,如果您曾经尝试使用非字节的东西进行此操作,则必须注意 FlatBuffer 中的数据始终是小端。

作为 const-cast 的替代方案,您可以使用 --gen-mutable 编译您的架构,这将为您提供额外的访问器以从 GetMutableRoot 开始就地修改数据, 并且 data() 也将是非常量。

关于c++ - flatbuffer c++:是否有可能从 flatbuffers::Vector 窃取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32720812/

相关文章:

java - 如何通过网络发送 FlatBuffers ByteBuffer?

c - 如何在 FlatBuffers 架构文件中声明指针类型?

go - Flatbuffer mutate 不会改变字节

c++ - 如何在 OSX 上构建 FlatBuffers ?

c++ - 使用 krb5 API 查找领域的 KDC

c++ - 运算符 << 如何与操纵器函数一起使用

c++ - 需要模板类和理解行错误的指导

c++ - 使用类对象填充 3D vector

c++ - ubuntu sdk qml 快速查看窗口关闭,最小化按钮不可见

flatbuffers - 如何流处理大于 RAM 的 FlatBuffers ?