Auf der offiziellen Website gibt es eine nice and relatively comprehensive example von, wie man CapnProto für C++ - Serialisierung verwenden könnte. Was fehlt, ist die Handhabung des zweiten Blob-Typs capnp::Data
, da nur capnp::Text
abgedeckt ist.So erhalten Sie byte [] in capnp :: Data
Nur der Vollständigkeit halber, hier ist das, was die Schema-Sprache sagt über die Blob-Typ:
Blobs: Text, Daten
...
Text immer UTF- 8 kodiert und NUL-terminiert.
Daten sind eine völlig willkürliche Folge von Bytes.
Also, wenn ich das folgende Schema
struct Tiding {
id @0 :Text;
payload @1 :Data;
}
haben kann ich meine Nachricht Gebäude wie dieses
::capnp::MallocMessageBuilder message;
Tiding::Builder tiding = message.initRoot<Tiding>();
tiding.setId("1");
An dieser Stelle ich stecken geblieben. Ich kann das nicht tun:
typedef unsigned char byte;
byte data[100];
... //populate the array
tiding.setPayload(data)
//error: no viable conversion from 'byte [100]' to '::capnp::Data::Reader'
So muckte ich ein bisschen herum und sah, dass capnp :: Daten kj::ArrayPtr<const byte>
wickelt, aber ich war nicht in der Lage, irgendwie einen Einfluß eines ArrayPtr
zu bekommen, viel weniger es verwenden, um festgelegt das Payload-Feld für meine Nachricht.
Ich sah, dass es eine Möglichkeit gibt, den Standardwert für den Typ Data
(d. H. payload @5 :Data = 0x"a1 40 33";
) festzulegen, aber die Schemasprache übersetzt in diesem Fall nicht wirklich in C++, so dass auch mir nicht geholfen hat.
Ich wäre dankbar, wenn jemand darauf hinweisen könnte, was ich hier vermisse. Auch, wie würde ich das tun, wenn ich List(Data)
anstelle von nur Data
als Payload in meinem Schema hätte?
Abgesehen: http://stackoverflow.com/questions/1725855/ uint8-t-vs-unsigned-char (Frage ist markiert C++ 11) – kfsone
Ich bin bewusst 'uint8_t', aber die unsigned char typedef wird innerhalb CapnProto (KJ, tatsächlich) verwendet, also ging ich damit. – Dave