アンパック時には、整数値は常にmsgpack_object
固定幅の 64 ビット整数 (int64_t
負の場合、負のuint64_t
場合) として格納されます。
et al. の詳細については、を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;
}
}
これは、pack 時に、msgpack がその値に従って整数をエンコードする最適な方法を動的に選択するためです。たとえば、msgpack_pack_uint16
整数を pack する場合:
- 値が [0, 127] の場合は 1 バイトで保存され、
0xcc
値が [128, 255] の場合は最初のバイトとして2 バイト、
- それ以外の場合は
0xcd
、最初のバイトとして3 バイト。
詳しくmsgpack_pack_real_uint16
はからcpp/src/msgpack/pack_template.h
ご覧ください。
言い換えると、展開時に、msgpack は整数値を保持するのに十分な大きさの正または負 (obj.type
がMSGPACK_OBJECT_POSITIVE_INTEGER
または かどうかをテスト) を使用します。MSGPACK_OBJECT_NEGATIVE_INTEGER
したがって、それはあなた次第です:
- 値がキャストタイプをオーバーフローしないと常に想定できる場合は、キャストします。
- または、値が受信者のタイプに対して十分に大きくないかどうかを (マスクを使用して) 動的にチェックします。
- または、常に または を使用し
int64_t
ますuint64_t
。
最後に、C テスト スイート ( msgpack/cpp/test/msgpackc_test.cpp
) は、コード サンプルを参照するのに役立つ場合があります。