MessagePack C API

CNK*_*CNK 1 c messagepack msgpack

在着眼于C API为MessagePack,有多个功能以适当地串行化(包)中的数据,根据类型:msgpack_pack_uint8,msgpack_pack_int32,...

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

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

如何正确拆包?

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

del*_*eil 8

在解包时,任何整数值始终存储在msgpack_object固定宽度的64位整数中(int64_t否则为负数uint64_t).

有关et al.的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是因为在打包时,msgpack动态地选择根据其值对整数进行编码的最佳方式,例如,如果您使用msgpack_pack_uint16打包整数,则:

  • 如果值在[0,127]中,它将保存为1个字节,
  • 2个字节0xcc作为第一个字节如果该值是在[128,255],
  • 0xcd否则为3个字节,第一个字节.

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)可能有助于浏览代码示例.