在查看用于MessagePack的type时,有许多函数可以根据类型适当地序列化(打包)数据:msgpack_pack_uint8、msgpack_pack_int32、...
在API中似乎没有相应的调用来解压数据。msgpack_unpack_next返回一个msgpack_object。根据包含的枚举,这些对象只有粗粒度的类型(最大的类型: int64,double,...)。
我是不是漏掉了什么?是否期望先使用粗略对象,然后进行强制转换?
应该如何正确地进行拆包?
此外,是否有好的文档或使用示例?网站上的那些都是微不足道的。
发布于 2012-09-25 18:27:13
解包时,任何整数值始终作为固定宽度的64位整数存储在msgpack_object中(如果为负数,则为int64_t;否则为uint64_t )。
有关msgpack_object等人的更多详细信息,请参阅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打包你的整数,那么:
如果值是0,127,则以1字节保存;如果值是128,255,则以
0xcd作为第一个字节。有关更多详细信息,请参阅来自cpp/src/msgpack/pack_template.h的msgpack_pack_real_uint16。
换句话说,在解包时,msgpack使用一个足够大的正值或负值(如果obj.type为MSGPACK_OBJECT_POSITIVE_INTEGER或MSGPACK_OBJECT_NEGATIVE_INTEGER,则进行测试)来容纳任何整数值。因此,这取决于你:
int64_t或最后,C测试套件(msgpack/cpp/test/msgpackc_test.cpp)可能有助于浏览代码示例。
https://stackoverflow.com/questions/12431441
复制相似问题