在 Cap'n Proto 中读写字节数组的正确语法?
Proper syntax to read and write byte array in 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
.
的类型定义
kj::ArrayPtr
本质上是一对 pointer/size。它实现了 operator[]
、size()
、begin()
、end()
等 begin()
和 end()
return 原始指针,不是一个特殊的迭代器类型。
建筑物:
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));
假设我有一个数组:
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
.
kj::ArrayPtr
本质上是一对 pointer/size。它实现了 operator[]
、size()
、begin()
、end()
等 begin()
和 end()
return 原始指针,不是一个特殊的迭代器类型。
建筑物:
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));