2012-09-14 85 views
1

在着眼於C API爲MessagePack,有多個功能以適當地串行化(包)中的數據,根據類型:msgpack_pack_uint8msgpack_pack_int32,...MessagePack C API

似乎沒有到在API中進行等效調用以解壓縮數據。 msgpack_unpack_next返回msgpack_object。這些對象只有粗粒度的類型(類型中最大的:int64,double,...),基於包含的枚舉。

我在這裏錯過了什麼嗎?是否期望粗糙的物體被使用然後被施放?

拆包應該如何正確完成?

此外,是否有任何良好的文檔或使用示例?那些在網站上的是微不足道的。

+0

哪裏是MessagePack的C API ? – sivann

+0

@sivann https://github.com/msgpack/msgpack-c或http://msgpack.org – CNK

+0

謝謝。我希望有更多的分析文檔。 – sivann

回答

8

在解包時,任何整數值總是被存儲(int64_t如果負,否則uint64_t)一個msgpack_object作爲固定寬度的64位整數範圍內。

有關詳細信息,請參閱第msgpack_object等,並cpp/src/msgpack/unpack.ccpp/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 bytes0xcd作爲第一字節,否則。

請參閱msgpack_pack_real_uint16cpp/src/msgpack/pack_template.h瞭解更多詳情。


在在解包時換句話說,msgpack使用一個足夠大的正或負的(如果測試是obj.typeMSGPACK_OBJECT_POSITIVE_INTEGERMSGPACK_OBJECT_NEGATIVE_INTEGER)持有的任何整數值。因此,它是由你來:

  • 投,如果你總是可以假設值永遠不會溢出你的施法型,
  • 或動態檢查(帶面罩)如果值是不是你的接收機足夠大類型,
  • 或者始終使用int64_tuint64_t

最後,C測試套件(msgpack/cpp/test/msgpackc_test.cpp)可能有助於瀏覽代碼示例。

+0

謝謝!我得出了同樣的結論。 msgpack在網絡上的效率非常高,您應該瞭解該協議以進行適當的轉換。該效率的成本是它不能自動推斷拆包時的原始類型。 – CNK