MessagePack C API(MessagePack C API)

2019-07-31 15:03发布

在着眼于C API为MessagePack,有许多的功能,以根据种类适当序列(包)中的数据: msgpack_pack_uint8msgpack_pack_int32 ,...

似乎没有要在API中等价的调用解压数据。 msgpack_unpack_next返回msgpack_object 。 这些对象只有类型的粗粒度(最大的类型:Int64类型,双,...)的基础上,枚举包括在内。

我失去了一些东西在这里? 是粗对象使用再投的期望?

应该如何拆包正确呢?

此外,有没有什么好的文档或使用的例子吗? 网站上的那些都是小事。

Answer 1:

在解包时,任何整数值始终存储一个内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_uint16cpp/src/msgpack/pack_template.h了解更多详情。


在解包时换句话说,msgpack使用一个足够大的正或负的(如果测试obj.typeMSGPACK_OBJECT_POSITIVE_INTEGERMSGPACK_OBJECT_NEGATIVE_INTEGER )持有的任何整数值。 因此,它是由你来:

  • 投,如果你总是可以假设值永远不会溢出你的施法型,
  • 或者,动态检查(带面罩)如果该值不够大,你的接收器类型,
  • 或者,总是使用int64_tuint64_t

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



文章来源: MessagePack C API