Msgpack 打包布尔错误
Msgpack packing bools bug
对于我的 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_true
和 pack_false
。是的,所以为了打包 bool,我只需要显式调用这两个函数就可以了。但不是。对于此测试:
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
有人可以帮我解决这个问题吗?库中有错误还是我做错了什么?
我真的不知道问题出在哪里,但我通过删除软件包 libmsgpackc2
和 libmsgpack3
并从 git repository 安装 msgpack 解决了这个问题。描述得很好。代码必须使用 -I msgpack-c/include
标志进行编译。
我猜想 Ubuntu 存储库中的 msgpack 包非常旧且已弃用。
对于我的 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_true
和 pack_false
。是的,所以为了打包 bool,我只需要显式调用这两个函数就可以了。但不是。对于此测试:
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
有人可以帮我解决这个问题吗?库中有错误还是我做错了什么?
我真的不知道问题出在哪里,但我通过删除软件包 libmsgpackc2
和 libmsgpack3
并从 git repository 安装 msgpack 解决了这个问题。描述得很好。代码必须使用 -I msgpack-c/include
标志进行编译。
我猜想 Ubuntu 存储库中的 msgpack 包非常旧且已弃用。