在Cap'n Proto中读取和写入字节数组的正确语法?
问题描述:
比方说,我有一个数组:在Cap'n Proto中读取和写入字节数组的正确语法?
struct UUID
{
char data[16];
};
而且我已经像这样的模式:
struct UUID
{
value @0 : Data;
}
什么是读写这个领域的正确方法?看起来我应该能够围绕数组包装一个capnp :: Data :: Reader并使用构建器的setValue(),但语法实际上并不明显。
另一种方式也有些神秘。反序列化时如何填充数组?我目前的做法涉及memcpy,但我认为有一个Cap'n Proto的方式来做到这一点。
答
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()
返回原始指针,而不是一个特殊的迭代器类型。
大厦:
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));