1

公式 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

4

1 に答える 1

7

Akj::ArrayPtrは基本的にポインタとサイズのペアです。

を呼び出すことkj::arrayPtr()で作成できます。これは、ポインターと配列サイズの 2 つの引数を取ります。例:

byte buffer[256];
kj::ArrayPtr<byte> bufferPtr = kj::arrayPtr(buffer, sizeof(buffer));

kj::ArrayPtrポインターを返すメソッドbegin()とメソッド、およびメソッドがあります。したがって、次のようにポインター/サイズに戻すことができます。end()size()

byte* ptr = bufferPtr.begin();
size_t size = bufferPtr.size();

あなたの例では、すべてをまとめると、次のことが必要になります。

tiding.setPayload(kj::arrayPtr(data, sizeof(data)));
于 2016-07-10T07:11:38.930 に答える