Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MessagePack C API_C_Msgpack_Messagepack - Fatal编程技术网

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,…) 我是不是遗漏了什么?是否期望使用粗糙对象,然后进行铸造 如何正确地打开包装 此外,是否有好的文档或使用示例?

在查看MessagePack的C API时,有许多函数可以根据类型适当地序列化(打包)数据:
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
is
msgpack\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或谢谢。我希望有更多的分析文档。我能找到的最好的文档是: