MessagePack C API
在查看MessagePack的C API时,有许多函数可以根据类型适当地序列化(打包)数据:MessagePack C API,c,msgpack,messagepack,C,Msgpack,Messagepack,在查看MessagePack的C API时,有许多函数可以根据类型适当地序列化(打包)数据:msgpack\u pack\u uint8,msgpack\u pack\u int32 API中似乎没有相应的调用来解压缩数据msgpack\u unpack\u next返回一个msgpack\u对象。基于包含的枚举,这些对象仅具有粗略的类型粒度(类型中最大的:int64,double,…) 我是不是遗漏了什么?是否期望使用粗糙对象,然后进行铸造 如何正确地打开包装 此外,是否有好的文档或使用示例?
msgpack\u pack\u uint8
,msgpack\u pack\u int32
API中似乎没有相应的调用来解压缩数据msgpack\u unpack\u next
返回一个msgpack\u对象
。基于包含的枚举,这些对象仅具有粗略的类型粒度(类型中最大的:int64,double,…)
我是不是遗漏了什么?是否期望使用粗糙对象,然后进行铸造
如何正确地打开包装
此外,是否有好的文档或使用示例?网站上的那些都是琐碎的 在解包时,任何整数值总是作为固定宽度的64位整数存储在
msgpack\u对象中(int64\u t
如果为负数,则uint64\u t
否则)
参见cpp/src/msgpack/object.h
了解有关msgpack\u 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\u pack\u uint16
打包整数,则:
- 如果值在[0,127]中,则它将保存在1字节中
- 如果值在[128255]中,则将
0xcc
作为第一个字节
- 将
0xcd
作为第一个字节,否则
有关详细信息,请参见cpp/src/msgpack/pack\u template.h
中的msgpack\u pack\u real\u uint16
换句话说,在解包时,msgpack使用足够大的正或负(如果obj.type
ismsgpack\u OBJECT\u positive\u INTEGER
或msgpack\u OBJECT\u negative\u INTEGER
)来保存任何整数值。因此,由您决定:
- 强制转换如果您始终可以假定值永远不会溢出强制转换类型
- 或者,动态检查(使用掩码),如果该值对于您的接收器类型来说不够大
- 或者,始终使用
int64\u t
或uint64\u t
最后,C测试套件(msgpack/cpp/test/msgpackc_test.cpp
)可能有助于浏览代码示例。谢谢!我得出了同样的结论。msgpack在网络上是高效的,您需要知道适当转换的协议。这种效率的代价是它无法在解包时自动推断原始类型。MessagePack的C API在哪里?@sivann或谢谢。我希望有更多的分析文档。我能找到的最好的文档是: