在解包時,任何整數值總是被存儲(int64_t
如果負,否則uint64_t
)一個msgpack_object
作爲固定寬度的64位整數範圍內。
有關詳細信息,請參閱第msgpack_object
等,並cpp/src/msgpack/unpack.c
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
來收拾你的整數,則:與0xcc
- 它將被保存在1個字節,如果該值在[0,127],
- 2 bytes作爲第一個字節,如果該值在[128 ,255],
- 3 bytes與
0xcd
作爲第一字節,否則。
請參閱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
)可能有助於瀏覽代碼示例。
哪裏是MessagePack的C API ? – sivann
@sivann https://github.com/msgpack/msgpack-c或http://msgpack.org – CNK
謝謝。我希望有更多的分析文檔。 – sivann