【问题标题】:Msgpack packing bools bugMsgpack 打包布尔错误
【发布时间】:2015-04-14 17:42:40
【问题描述】:

对于我的 C++ 项目,我使用 Ubuntu (14.04) 标准存储库中名为 libmsgpack-dev 的 c++ msgpack 库。

一切正常,除非我尝试打包一些布尔值。那里的事情绝对是香蕉。首先我写了一个简单的测试来研究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

有人可以帮我解决这个问题吗?库中有错误还是我做错了什么?

【问题讨论】:

    标签: c++ msgpack


    【解决方案1】:

    我真的不知道问题出在哪里,但我通过删除包 libmsgpackc2libmsgpack3 并从 git repository 安装 msgpack 解决了这个问题。描述得很好。代码必须使用-I msgpack-c/include 标志编译。

    我猜 Ubuntu 存储库中的 msgpack 包非常陈旧且已弃用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 2011-10-24
      • 2015-10-10
      相关资源
      最近更新 更多