公式 Web サイトには、C++ シリアライゼーションに CapnProto を使用する方法の、比較的包括的な例があります。欠けているのは、2 番目の Blob タイプを処理する方法capnp::Data
だけcapnp::Text
です。
完全を期すために、スキーマ言語がブロブ型について述べていることを次に示します。
ブロブ: テキスト、データ
...
テキストは常に UTF-8 でエンコードされ、NUL で終了します。
データは完全に任意のバイト列です。
したがって、次のスキーマがある場合
struct Tiding {
id @0 :Text;
payload @1 :Data;
}
このようにメッセージを作成し始めることができます
::capnp::MallocMessageBuilder message;
Tiding::Builder tiding = message.initRoot<Tiding>();
tiding.setId("1");
この時点で行き詰まりました。私はこれを行うことはできません:
typedef unsigned char byte;
byte data[100];
... //populate the array
tiding.setPayload(data)
//error: no viable conversion from 'byte [100]' to '::capnp::Data::Reader'
だから私は少しいじって、 capnp::Data がラップしているのを見ましたがkj::ArrayPtr<const byte>
、どうにかして を手に入れることができませんでしたArrayPtr
。
型のデフォルト値Data
(つまりpayload @5 :Data = 0x"a1 40 33";
) を設定する方法があることがわかりましたが、この場合、スキーマ言語は実際には C++ に変換されないため、これも役に立ちませんでした。
ここで私が見逃していることを誰かが指摘できれば幸いです。また、スキーマのペイロードとしてではList(Data)
なく、これを行うにはどうすればよいですか?Data