MessagePack C API
在查看MessagePack的C API时,有许多函数可以根据类型适当地序列化(打包)数据: msgpack_pack_uint8
, msgpack_pack_int32
,…
在API中似乎没有等效的调用来解压缩数据。 msgpack_unpack_next
返回一个msgpack_object
。 这些对象仅具有粗粒度类型(类型中最大的:int64,double,…),基于所包含的枚举。
我在这里错过了什么吗? 是期望使用粗物体然后再投射?
如何正确拆包?
此外,有没有好的文档或用法示例? 网站上的内容很简单。
在解包时,任何整数值总是作为固定宽度的64位整数存储在msgpack_object
中(如果为负,则为int64_t
,否则为uint64_t
)。
有关msgpack_object
等人和cpp/src/msgpack/unpack.c
更多详细信息,请参阅cpp/src/msgpack/object.h
,以了解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
打包整数,则:
- 如果值在[0,127]中,它将以1个字节保存,
- 如果值为[128,255],则以
0xcc
作为第一个字节的2个字节 , - 否则, 3字节,其中
0xcd
作为第一个字节。
有关更多详细信息,请参阅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
)可能有助于浏览代码示例。