c++ - 如何将 byte[] 放入 capnp::Data

标签 c++ c++11 capnproto

在官网上,有一个nice and relatively comprehensive example关于如何使用 CapnProto 进行 C++ 序列化。缺少的是如何处理第二个 Blob 类型 capnp::Data ,仅作为 capnp::Text被覆盖。

为了完整起见,这里是模式语言对 blob 类型的描述:

Blobs: Text, Data

...

  • Text is always UTF-8 encoded and NUL-terminated.

  • Data is a completely arbitrary sequence of bytes.

所以,如果我有以下模式

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 ,更不用说使用它为我的消息设置 Payload 字段了。

我看到有一种方法可以为 Data 类型设置默认值(即 payload @5 :Data = 0x"a1 40 33"; ),但在这种情况下,模式语言并没有真正转化为 C++,所以这对我也没有帮助。

如果有人能指出我在这里遗漏了什么,我将不胜感激。另外,如果我有 List(Data) 我会怎么做呢?而不仅仅是 Data作为我架构中的有效负载?

最佳答案

kj::ArrayPtr 基本上是一对指针和大小。

您可以通过调用 kj::arrayPtr() 创建一个,它有两个参数:一个指针和数组大小。示例:

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

关于c++ - 如何将 byte[] 放入 capnp::Data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38285733/

相关文章:

c++ - switch 语句直接转到 default

c++ - 无法观看 TVN_SELCHANGED

c++ - 丢弃视频帧

c# - 使用 C# 将非常大的项目列表序列化到 Azure blob 存储中

c++ - 自定义排序元组 vector 时出错

c++ - 允许使用右值捕获但不分配给的运算符重载

c++ - 双重检查锁定 : Fences and atomics

c++ - C++11 的标准库会有前向声明头吗?

c++ - CapnProto - 在回调中向其他服务器请求

c++ - 将 3rd 方异步 API 与 Cap'n Proto RPC 集成的好方法是什么?