我正在尝试将结构转换为C或C ++的msgpack。请在下面找到代码:
struct your_type {
int a;
float b;
MSGPACK_DEFINE(a, b);
};
int main() {
// packing
std::stringstream ss;
std::vector<std::map<std::string, your_type>> v
{
{
{ "t", {1,2.7} }
},
{
{"value", {2, 6.8} }
}
};
msgpack::pack(ss, v);
}
我了解如何使用msgpack::object_handle
将此输出转换为对象。但是我想用C打印打包的输出,因此要验证它是否看起来像我们在将数据帧转换为Python中的msgpack
之后获得的格式一样。如何显示msgpack::pack
输出?
编辑:注释中提到的答案hex_dump()实际上有助于获得答案。
struct your_type {
int a;
int b;
MSGPACK_DEFINE(a, b);
};
int main() {
std::stringstream ss;
std::vector<std::map<std::string, your_type>> v
{
{
{ "t",{ 1, 2 } }
},
{
{ "value",{ 3, 6 } }
}
};
msgpack::pack(ss, v);
hex_dump(std::cout, ss.str()) << std::endl;
}
我能够将此结构转换为十六进制值。但是我正在尝试为struct中的b设置一个浮点值,以便“值”可以采用浮点值。但我无法这样做。有人可以在这方面指导我吗?
答案 0 :(得分:0)
msgpack::pack
将打包的内容写入类型为std::stringstream
的第一个参数中,因此打印起来应该很容易:
msgpack::pack(ss, v)
std::string string_buffer = ss.str()
std::cout << s << '\n';
答案 1 :(得分:0)
经过一番交谈,我了解您的问题包含两个不同的部分。 一种是如何将打包数据打印为类似于python的人类可读十六进制格式。 另一个是如何在msgpack中处理好float值。
下面是回答这两个部分的代码。
#include <sstream>
#include <iostream>
#include <msgpack.hpp>
inline std::ostream& hex_dump(std::ostream& o, std::string const& v) {
std::ios::fmtflags f(o.flags());
o << std::hex;
for (auto c : v) {
o << "\\x" << std::setw(2) << std::setfill('0') << (static_cast<int>(c) & 0xff);
}
o.flags(f);
return o;
}
struct your_type {
int a;
float b;
MSGPACK_DEFINE(a, b);
};
int main() {
// packing
std::stringstream ss;
std::vector<std::map<std::string, your_type>> v
{
{
{ "t", {1,2.7} }
},
{
{"value", {2, 6.8} }
}
};
msgpack::pack(ss, v);
// hex dump output
hex_dump(std::cout, ss.str()) << std::endl;
auto oh = msgpack::unpack(ss.str().data(), ss.str().size());
// JSON output
std::cout << oh.get() << std::endl;
}
Runnning演示:https://wandbox.org/permlink/DanDq9QTW6JZ6MO0
函数hex_dump()
将std :: string作为十六进制转储格式输出到ostream
。
您可以使用类似于int的float值。没什么大不同。