1

配列があるとしましょう:

struct UUID
{
    char data[16];
};

そして、私はスキーマで次のようにしています:

struct UUID
{
    value @0 : Data;
}

このフィールドを読み書きする適切な方法は何ですか? 配列の周りにcapnp::Data::Readerをラップし、ビルダーの setValue() を使用できるはずですが、構文は実際には明らかではありません。

もう一方の方法もやや神秘的です。デシリアライズ時に配列を設定するにはどうすればよいですか? 私の現在のアプローチには memcpy が含まれていますが、それを行うには Cap'n Proto の方法があると思います。

4

1 に答える 1

3

Data::Readerは本質的にkj::ArrayPtr<const kj::byte>です。

Data::Builderは本質的にkj::ArrayPtr<kj::byte>です。

kj::byteの typedef ですunsigned char

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));
于 2016-12-02T18:32:25.427 に答える