MessagePack C API

在查看MessagePack的C API时,有许多函数可以根据类型适当地序列化(打包)数据: msgpack_pack_uint8msgpack_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_INTEGERMSGPACK_OBJECT_NEGATIVE_INTEGER )来保存任何整数值。 所以由你决定:

  • 如果您总是可以假设值永远不会溢出您的演员类型,
  • 或者,动态检查(使用掩码),如果该值对于您的接收器类型而言不够大,
  • 或者,始终使用int64_tuint64_t

最后,C测试套件( msgpack/cpp/test/msgpackc_test.cpp )可能有助于浏览代码示例。