如何将 byte[] 变成 capnp::Data
How to get byte[] into capnp::Data
在官方网站上,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
,更不用说使用它来设置了我消息的有效负载字段。
我看到有一种方法可以为类型 Data
(即 payload @5 :Data = 0x"a1 40 33";
)设置默认值,但在这种情况下模式语言并没有真正转换为 C++,所以这对我也没有帮助。
如果有人能指出我在这里遗漏了什么,我将不胜感激。另外,如果我将 List(Data)
而不是 Data
作为模式中的有效负载,我将如何执行此操作?
A kj::ArrayPtr
基本上是一对指针和大小。
您可以通过调用 kj::arrayPtr()
创建一个,它有两个参数:一个指针和数组大小。示例:
byte buffer[256];
kj::ArrayPtr<byte> bufferPtr = kj::arrayPtr(buffer, sizeof(buffer));
kj::ArrayPtr
有 begin()
和 end()
方法,其中 return 指针,还有一个 size()
方法。所以你可以像这样转换回 pointer/size:
byte* ptr = bufferPtr.begin();
size_t size = bufferPtr.size();
综合起来,在您的示例中,您需要:
tiding.setPayload(kj::arrayPtr(data, sizeof(data)));
在官方网站上,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
,更不用说使用它来设置了我消息的有效负载字段。
我看到有一种方法可以为类型 Data
(即 payload @5 :Data = 0x"a1 40 33";
)设置默认值,但在这种情况下模式语言并没有真正转换为 C++,所以这对我也没有帮助。
如果有人能指出我在这里遗漏了什么,我将不胜感激。另外,如果我将 List(Data)
而不是 Data
作为模式中的有效负载,我将如何执行此操作?
A kj::ArrayPtr
基本上是一对指针和大小。
您可以通过调用 kj::arrayPtr()
创建一个,它有两个参数:一个指针和数组大小。示例:
byte buffer[256];
kj::ArrayPtr<byte> bufferPtr = kj::arrayPtr(buffer, sizeof(buffer));
kj::ArrayPtr
有 begin()
和 end()
方法,其中 return 指针,还有一个 size()
方法。所以你可以像这样转换回 pointer/size:
byte* ptr = bufferPtr.begin();
size_t size = bufferPtr.size();
综合起来,在您的示例中,您需要:
tiding.setPayload(kj::arrayPtr(data, sizeof(data)));