在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::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));