在查看MessagePack的C API时,有许多函数可以根据类型适当地序列化(打包)数据:msgpack_pack_uint8
,msgpack_pack_int32
,...
在API中似乎没有等效的调用来解压缩数据。 msgpack_unpack_next
会返回msgpack_object
。这些对象仅具有粗粒度类型(类型中最大的:int64,double,...),基于所包含的枚举。
我在这里遗漏了什么吗?期望使用粗物体然后再施放吗?
如何正确拆包?
此外,有没有好的文档或用法示例?网站上的那些是微不足道的。
答案 0 :(得分:8)
在解包时,任何整数值总是存储在msgpack_object
内作为固定宽度的64位整数(如果是负int64_t
,否则为uint64_t
。
有关cpp/src/msgpack/object.h
等人和msgpack_object
的详细信息,请参阅cpp/src/msgpack/unpack.c
以了解msgpack如何处理解包逻辑,例如:
static inline int template_callback_int8(unpack_user* u,
int8_t d,
msgpack_object* o) {
if(d >= 0) {
o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d;
return 0;
}
else {
o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d;
return 0;
}
}
这是因为在打包时,msgpack动态地选择根据其值对整数进行编码的最佳方式,例如:如果您使用msgpack_pack_uint16
来打包整数:
有关详细信息,请参阅msgpack_pack_real_uint16
的{{1}}。
换句话说,在解压缩时,msgpack使用足够大的正或负(测试cpp/src/msgpack/pack_template.h
是obj.type
还是MSGPACK_OBJECT_POSITIVE_INTEGER
)来保存任何整数值。所以由你来决定:
MSGPACK_OBJECT_NEGATIVE_INTEGER
或int64_t
。最后,C测试套件(uint64_t
)可能有助于浏览代码示例。