在解包时,任何整数值始终msgpack_object
作为固定宽度的 64 位整数存储在 a 中(int64_t
如果为负,则为负uint64_t
)。
有关等人cpp/src/msgpack/object.h
的更多详细信息,请参阅 msgpack 如何处理解包逻辑,例如:msgpack_object
cpp/src/msgpack/unpack.c
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 个字节中,
0xcc
如果值在 [128, 255] 中,则2 个字节作为第一个字节,
- 3 个字节,
0xcd
否则作为第一个字节。
有关msgpack_pack_real_uint16
更多cpp/src/msgpack/pack_template.h
详细信息,请参阅。
换句话说,在解包时,msgpack 使用足够大的正数或负数(测试 if obj.type
is MSGPACK_OBJECT_POSITIVE_INTEGER
or MSGPACK_OBJECT_NEGATIVE_INTEGER
)来保存任何整数值。所以这取决于你:
- 如果您始终可以假设值永远不会溢出您的转换类型,则进行转换,
- 或者,如果该值对于您的接收器类型来说不够大,则动态检查(使用掩码),
- 或者,总是使用
int64_t
or uint64_t
。
最后,C 测试套件 ( msgpack/cpp/test/msgpackc_test.cpp
) 可能有助于浏览代码示例。