如何显示消息打包结构

时间:2018-11-07 11:43:06

标签: python c++ dataframe msgpack

我正在尝试将结构转换为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设置一个浮点值,以便“值”可以采用浮点值。但我无法这样做。有人可以在这方面指导我吗?

2 个答案:

答案 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值。没什么大不同。