flatbuffer c ++:是否可以从flatbuffers :: Vector中窃取

时间:2015-09-22 15:21:58

标签: c++ flatbuffers

我是flatbuffer的新用户,我想知道是否可以对flatbuffers::Vector中的数据进行完整(非const *)访问。查看下面的示例,我想窃取img2::mem::data的所有权,将其存储在Img-struct中并以我想要的任何方式处理它。这是不可能的,没有记忆?

    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;
    }

1 个答案:

答案 0 :(得分:1)

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

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

除了const-cast之外,您可以使用--gen-mutable编译您的模式,这将为您提供额外的访问者,以便从GetMutableRoot开始就地修改数据,而data()也将是非从那里开始。