假设我有一个数组:
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));
关于c++ - 在 Cap'n Proto 中读写字节数组的正确语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40930548/