在着眼于C API为MessagePack,有许多的功能,以根据种类适当序列(包)中的数据: msgpack_pack_uint8
, msgpack_pack_int32
,...
似乎没有要在API中等价的调用解压数据。 msgpack_unpack_next
返回msgpack_object
。 这些对象只有类型的粗粒度(最大的类型:Int64类型,双,...)的基础上,枚举包括在内。
我失去了一些东西在这里? 是粗对象使用再投的期望?
应该如何拆包正确呢?
此外,有没有什么好的文档或使用的例子吗? 网站上的那些都是小事。
在解包时,任何整数值始终存储一个内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
收拾你的整数,则:
- 它将被保存在1个字节如果该值是在[0,127],
- 2个字节用
0xcc
作为第一个字节如果该值是在[128,255], - 3个字节与
0xcd
另有第一个字节。
见msgpack_pack_real_uint16
从cpp/src/msgpack/pack_template.h
了解更多详情。
在解包时换句话说,msgpack使用一个足够大的正或负的(如果测试obj.type
是MSGPACK_OBJECT_POSITIVE_INTEGER
或MSGPACK_OBJECT_NEGATIVE_INTEGER
)持有的任何整数值。 因此,它是由你来:
- 投,如果你总是可以假设值永远不会溢出你的施法型,
- 或者,动态检查(带面罩)如果该值不够大,你的接收器类型,
- 或者,总是使用
int64_t
或uint64_t
。
最后,将C测试套件( msgpack/cpp/test/msgpackc_test.cpp
)可能会有所帮助浏览代码示例。