假设我有一个数组:
struct UUID
{
char data[16];
};
我在架构中也是如此:
struct UUID
{
value @0 : Data;
}
读取和写入此字段的正确方法是什么?看起来我应该能够在数组周围包装 capnp :: Data :: Reader 并使用构建器的setValue(),但语法真的不明显。
另一种方式也有点神秘。反序列化时如何填充数组?我目前的方法涉及memcpy,但我认为有一种Cap'n Proto方法可以做到。
答案 0 :(得分:2)
Data::Reader
基本上是kj::ArrayPtr<const kj::byte>
。
Data::Builder
基本上是kj::ArrayPtr<kj::byte>
。
kj::byte
是unsigned char
的typedef。
kj::ArrayPtr
本质上是一个指针/大小对。它实现了operator[]
,size()
,begin()
,end()
等。begin()
和end()
返回原始指针,而不是特殊的迭代器类型。< / p>
大厦:
UUID::Builder builder = ...;
kj::byte buf[16] = ...;
// option 1
builder.setData(kj::arrayPtr(buf, sizeof(buf)));
// option 2
memcpy(builder.initData(16).begin(), buf, 16);
读:
UUID::Reader reader = ...;
auto data = reader.getData();
// option 1
// void someFunction(kj::byte* ptr, size_t size)
someFunction(data.begin(), data.size());
// option 2
kj::byte buf[16];
KJ_REQUIRE(data.size() == sizeof(buf));
memcpy(buf, data.begin(), sizeof(buf));