如何将byte []转换为capnp :: Data

时间:2016-07-09 19:46:49

标签: c++ c++11 capnproto

在官方网站上,有一个nice and relatively comprehensive example如何使用CapnProto进行C ++序列化。缺少的是如何处理第二个Blob类型capnp::Data,因为只涵盖了capnp::Text

为了完整起见,以下是Schema Language对blob类型的描述:

  

Blob:文字,数据

     

...

     
      
  • 文本始终采用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,更不用说它来设置Payload字段我的留言。

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

如果有人能指出我在这里缺少的东西,我将不胜感激。另外,如果我在架构中使用List(Data)而不仅仅Data作为Payload,我将如何执行此操作?

1 个答案:

答案 0 :(得分:4)

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)));
相关问题