2015-04-14 3 views
0

Для моего проекта C++ я использую библиотеку C++ msgpack, доступную в стандартном репозитории Ubuntu (14.04) под именем libmsgpack-dev.Ошибка обмана bsspacks Msgpack

Все работает нормально, за исключением случаев, когда я пытаюсь упаковать несколько болтов. Там дела идут абсолютно бананы. Сначала я написал простой тест для изучения метода pack. Оказалось, что на упаковку bools нельзя доверять. Вот простой тест, демонстрирующий проблему:

#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 

Я думал, OK, есть обходной путь? Да, я обнаружил методы pack_true и pack_false. Правильно, поэтому для упаковки bools мне просто нужно явно вызвать эти две функции, и это будет работать нормально. Но нет. Для этого теста:

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 

Может кто-то пожалуйста, помогите мне это? Есть ли ошибка в библиотеке, или я делаю что-то неправильно?

ответ

0

Я действительно не знаю, в чем проблема, но я решил это, удалив пакеты libmsgpackc2 и libmsgpack3 и установив msgpack от git repository. Это хорошо описано. Код, который должен быть скомпилирован с флагом -I msgpack-c/include.

Я предполагаю, что пакет msgpack в репозитории Ubuntu очень старый и устарел.