MessagePack C API

时间:2012-09-14 20:19:47

标签: c msgpack messagepack

在查看MessagePack的C API时,有许多函数可以根据类型适当地序列化(打包)数据:msgpack_pack_uint8msgpack_pack_int32,...

在API中似乎没有等效的调用来解压缩数据。 msgpack_unpack_next会返回msgpack_object。这些对象仅具有粗粒度类型(类型中最大的:int64,double,...),基于所包含的枚举。

我在这里遗漏了什么吗?期望使用粗物体然后再施放吗?

如何正确拆包?

此外,有没有好的文档或用法示例?网站上的那些是微不足道的。

1 个答案:

答案 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来打包整数:

  • 如果值在[0,127],
  • 中,它将以1个字节保存 如果值为[128,255],则
  • 2 bytes0xcc作为第一个字节,
  • 3 bytes,其中0xcd为第一个字节。

有关详细信息,请参阅msgpack_pack_real_uint16的{​​{1}}。


换句话说,在解压缩时,msgpack使用足够大的正或负(测试cpp/src/msgpack/pack_template.hobj.type还是MSGPACK_OBJECT_POSITIVE_INTEGER)来保存任何整数值。所以由你来决定:

    如果你总是可以假设值永远不会溢出你的演员类型,那么
  • 施放
  • 或者,动态检查(使用掩码),如果该值不足以容纳您的接收器类型,
  • 或始终使用MSGPACK_OBJECT_NEGATIVE_INTEGERint64_t

最后,C测试套件(uint64_t)可能有助于浏览代码示例。