簡體   English   中英

Msgpack包裝布爾錯誤

[英]Msgpack packing bools bug

對於我的C ++項目,我使用Ubuntu(14.04)標准存儲庫中提供的c ++ msgpack庫,名稱為libmsgpack-dev。

一切正常,除非我嘗試打包一些布爾值。 那里絕對是香蕉。 首先,我編寫了簡單的測試學習pack方法。 事實證明,它不能被信任用於包裝布爾。 這是顯示問題的簡單測試:

#include <msgpack.hpp>
TEST_CASE("bool packing", "[msgpack1]") {
    msgpack::sbuffer buf;
    msgpack::packer<msgpack::sbuffer> p(&buf);
    std::string key = "BoolValue";
    bool value      = true;

    p.pack_map(1);
    {
        p.pack(key);
        p.pack(value);
    }

    msgpack::unpacked msg;
    msgpack::unpack(&msg, buf.data(), buf.size());    

    std::map<std::string, msgpack::object> m;
    msg.get().convert(&m);

    bool loaded_value;
    m.at(key).convert(&loaded_value);

    INFO("We packed:  " << value);
    INFO("We loaded:  " << loaded_value);

    REQUIRE(value == loaded_value);
}

結果:

unit_tests/unit_msgpack.cpp:30: FAILED:
  REQUIRE( value == loaded_value )
with expansion:
  true == false
with messages:
  We packed:  1
  We loaded:  0

我以為可以,有辦法嗎? 是的,我發現了方法pack_truepack_false 是的,所以對於包裝布爾值,我只需要顯式調用這兩個函數,它就可以正常工作。 但不是。 對於此測試:

TEST_CASE("bool packing two elements", "[msgpack2]") {
    msgpack::sbuffer buf;
    msgpack::packer<msgpack::sbuffer> p(&buf);
    std::string key1 = "BoolValue1";
    std::string key2 = "BoolValue2";
    bool value1      = false;
    bool value2      = true;

    p.pack_map(2);
    {
        p.pack(key1);
        if (value1) {
            p.pack_true();
        } else {
            p.pack_false();
        }

        p.pack(key2);
        if (value2) {
            p.pack_true();
        } else {
            p.pack_false();
        }
    }

    msgpack::unpacked msg;
    msgpack::unpack(&msg, buf.data(), buf.size());

    std::map<std::string, msgpack::object> m;
    msg.get().convert(&m);

    bool loaded_value1;
    bool loaded_value2;
    m.at(key1).convert(&loaded_value1);
    m.at(key2).convert(&loaded_value2);

    INFO("We packed:  " << value1        << " : " << value2);
    INFO("We loaded:  " << loaded_value1 << " : " << loaded_value2);

    REQUIRE((value1 == loaded_value1 && value2 == loaded_value2));
}

我得到以下結果:

unit_tests/unit_msgpack.cpp:72: FAILED:
  REQUIRE( (value1 == loaded_value1 && value2 == loaded_value2) )
with expansion:
  false
with messages:
  We packed:  0 : 1
  We loaded:  0 : 0

有人可以幫我嗎? 庫中是否有錯誤,或者我做錯了什么?

我真的不知道問題出在哪里,但我通過刪除軟件包libmsgpackc2libmsgpack3並從git倉庫安裝msgpack來解決了。 描述得很好。 必須使用-I msgpack-c/include標志編譯的代碼。

我猜想Ubuntu存儲庫中的msgpack軟件包非常舊並且已棄用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM