首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MessagePack C API

MessagePack C API
EN

Stack Overflow用户
提问于 2012-09-15 04:19:47
回答 1查看 4.2K关注 0票数 2

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

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

我是不是漏掉了什么?是否期望先使用粗略对象,然后进行强制转换?

应该如何正确地进行拆包?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-25 18:27:13

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

有关msgpack_object等人的更多详细信息,请参阅cpp/src/msgpack/object.h,以及查看msgpack如何处理解包逻辑,例如:

代码语言:javascript
复制
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 bytes作为第一个字节;如果值是128,255,则以

  • 3 bytes作为第一个字节;否则,将以0xcd作为第一个字节。

有关更多详细信息,请参阅来自cpp/src/msgpack/pack_template.hmsgpack_pack_real_uint16

换句话说,在解包时,msgpack使用一个足够大的正值或负值(如果obj.typeMSGPACK_OBJECT_POSITIVE_INTEGERMSGPACK_OBJECT_NEGATIVE_INTEGER,则进行测试)来容纳任何整数值。因此,这取决于你:

  • cast如果您始终可以假设值永远不会溢出您的cast类型,
  • 或,动态检查(使用掩码)如果值对于您的接收器类型
  • 或不够大,请始终使用int64_t

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12431441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档