【问题标题】:Packing/Unpacking C-Style Arrays with Msgpack使用 Msgpack 打包/解包 C 样式数组
【发布时间】:2016-05-16 11:42:45
【问题描述】:

我已经下载了 1.4.1 并搜索了所有示例,包括 Wiki 和 Google,但找不到任何东西,所以转到这里。

有什么方法可以打包/解包数据类型为 char、std::string、用户定义类的数组?

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

我已经尝试为 std::string 数组执行此操作,但无法使其工作。

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

感谢和问候, 奥维斯。

【问题讨论】:

标签: msgpack


【解决方案1】:

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

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

msgpack-c 2.0 版将支持打包/解包 C 样式数组。 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

【讨论】:

  • 这是否适用于可变/动态长度数组,即使大小已知?
  • 动态长度数组是什么意思?在 C++ 上?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多