c++ - 在 Cap'n Proto 中读写字节数组的正确语法?

标签 c++ capnproto

假设我有一个数组:

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::byteunsigned 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/

相关文章:

android - Wire protocol buffers 与 Cap'n proto - 哪个更好?

c++ - 什么是复制省略和返回值优化?

C++ [错误] 'operator==' 不匹配(操作数类型为 'Vehicle' 和 'const Vehicle')

c++ - 船长原型(prototype) : Piecewise write large message to disk

rust - Cap'n proto 的可变状态

c++ - 如何在 capnproto C++ 生成的代码中设置列表的字符串项?

c++ - 错误 : swscale headers not found! 安装 FFmpeg 或 Libav

c++ - Rcpp 如何检查 vector/矩阵边界?

c++ - 运算符+ 重载错误。无法返回对对象的引用