在查看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
打包整数,则:
有关更多详细信息,请参阅cpp/src/msgpack/pack_template.h
。
换句话说,在解包时,msgpack使用足够大的正或负(测试obj.type
是否为MSGPACK_OBJECT_POSITIVE_INTEGER
或MSGPACK_OBJECT_NEGATIVE_INTEGER
)来保存任何整数值。 所以由你决定:
最后,C测试套件( msgpack/cpp/test/msgpackc_test.cpp
)可能有助于浏览代码示例。
以上就是c/c++开发分享MessagePack C API相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560502.html