0

我正在与 Cap'n'Proto 合作,我的理解是没有必要进行序列化,因为它已经完成了。所以我的问题是,我将如何访问序列化数据并获取它的大小,以便我可以将它作为字节数组传递给另一个库。

// person.capnp
struct Person {
    name @0 :Text;
    age @1 :Int16;
}

// ...
::capnp::MallocMessageBuilder message;

Person::Builder person = message.initRoot<Person>();
person.setName("me");
person.setAge(20);

// at this point, how do I get some sort of handle to 
// the serialized data of 'person' as well as it's size?

我看过这个writePackedMessageToFd(fd, message);电话,但不太明白传递了什么,也找不到任何 API 文档。我也没有尝试写入文件描述符,因为我需要以const void*.

在 Capnproto 的 message.h 文件中查看此函数,它位于 MallocMessageBuilder 的基类中,表示它获取构成消息的原始数据。

kj::ArrayPtr<const kj::ArrayPtr<const word>> getSegmentsForOutput();
// Get the raw data that makes up the message.

但即便如此,我也不知道如何将它作为const void*.

想法?

4

2 回答 2

0
::capnp::MallocMessageBuilder message;

是你的二进制消息,它的大小是

message.sizeInWords()

(以字节为单位的大小除以 8)。

于 2021-06-23T20:07:27.087 回答
0

这似乎是所需要的。

// ...
::capnp::MallocMessageBuilder message;

Person::Builder person = message.initRoot<Person>();
person.setName("me");
person.setAge(20);

kj::Array<capnp::word> dataArr = capnp::messageToFlatArray(message);
kj::ArrayPtr<kj::byte> bytes = dataArr.asBytes();

std::string data(bytes.begin(), bytes.end());

const void* dataPtr = data.c_str();

在这一点上,我有一个const void* dataPtr使用data.size().

于 2021-06-24T16:41:25.103 回答