使用Msgpack打包/拆包C型阵列

时间:2016-05-16 11:42:45

标签: msgpack

我已经下载了1.4.1并搜索了所有的例子,Wiki和谷歌,但是找不到任何东西,所以转到这里。

有没有办法打包/解包数据类型为char,std :: string,用户定义类的数组?

char data[10];
std::string data2[10];
UserClass data3[20];

我已经尝试过为std :: string数组做这个但是无法使它工作。

我将我的代码从boost :: serialization库移植到MsgPack。我将不胜感激。

谢谢&问候, Owais。

1 个答案:

答案 0 :(得分:0)

不幸的是,msgpack-c 1.4.1版本没有打包/解包C-Style阵列的功能。唯一的例外是C样式的char数组。它打包为STR(https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str)。

也许这不是你期望的行为。

msgpack-c 2.0版将支持打包/解压缩C-Style阵列。 master分支已经支持它。见https://github.com/msgpack/msgpack-c/pull/466

它可以打包/解压所有以下变量:

char data[10];
std::string data2[10];
UserClass data3[20];

查看完整的示例: http://melpon.org/wandbox/permlink/20WTgAATDhTX3rBA

std :: string数组和UserClass数组可以传递给msgpack::packmsgpack::object::convert。这很简单。

// Packing
std::stringstream ss;
std::string data2[2] = { "ABC", "DEFG" };
msgpack::pack(ss, data2); // As ARRAY

// Unpacking
auto oh2 = msgpack::unpack(ss.str().data(), ss.str().size(), off);

// Converting
std::string c_data2[2];
oh2.get().convert(c_data2);

但是一个char数组被打包为STR作为默认值。如果要将其打包为ARRAY,则需要使用msgpack::type::array_ref。为方便起见,我们提供msgpack::type::make_array_ref函数来创建msgpack::type::array_ref

std::stringstream ss;
char data1[3] = { 'A', 'B', '\0' };

// Packing
msgpack::pack(ss, msgpack::type::make_array_ref(data1)); // As ARRAY

// Unpacking
auto oh1_array = msgpack::unpack(ss.str().data(), ss.str().size(), off);

// Converting
char c_data1_array[3];
auto ar = msgpack::type::make_array_ref(c_data1_array);
oh1_array.get().convert(ar);

这是C-Stype数组和msgpack类型之间的映射。

char[]          : STR
unsigned char[] : BIN
T[]             : ARRAY (T means all other types.)

因此,当您想要将char[]unsigned char[]映射到ARRAY时,您需要使用msgpack::type::array_ref