1

I'm new to flatbuffer and I want to know if it's possible to get full (not const*) access to data in flatbuffers::Vector. Looking at the example below, I want to steal the ownership of img2::mem::data to store it in an Img-struct and process it in any way I want. Is this somehow possible, without 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;
    }
4

1 回答 1

1

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

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

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

于 2015-09-22T16:24:42.413 回答