首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Msgpack包装bools bug

Msgpack包装bools bug
EN

Stack Overflow用户
提问于 2015-04-14 17:42:40
回答 1查看 170关注 0票数 0

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

一切都很好,除了我试着装一些布。有些事情绝对是疯狂的。首先,我写了一个简单的测试来学习pack方法。事实证明,它不能被信任来包装木屑。下面是显示问题的简单测试:

代码语言:javascript
复制
#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);
}

其结果是:

代码语言:javascript
复制
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方法。对,所以对于打包bools,我只需要显式地调用这两个函数,它就可以正常工作了。但不是。对于这个测试:

代码语言:javascript
复制
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));
}

我得到了以下结果:

代码语言:javascript
复制
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

有人能帮我解决这个问题吗?图书馆里有窃听器吗?还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-14 18:37:20

我不知道问题是什么,但我通过删除包libmsgpackc2libmsgpack3以及从git存储库中安装msgpack来解决问题。它被描述得很好。必须使用-I msgpack-c/include标志编译的代码。

我想Ubuntu存储库中的msgpack包已经非常古老,不再受欢迎了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29634011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档