Как отобразить упакованную структуру сообщения - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь преобразовать структуру в msgpack на C или C ++. Пожалуйста, найдите код ниже:

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, чтобы проверить, выглядит ли он как формат, который мы получаем после преобразования кадра данных в msgpack в Python. Как я могу отобразить вывод 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;
}

Я могу преобразовать эту структуру в шестнадцатеричные значения. Но я пытаюсь создать значение с плавающей точкой для b в структуре, чтобы «значение» могло принимать значения с плавающей точкой. Я не в состоянии сделать это, хотя. Может ли кто-нибудь, пожалуйста, направить меня в этом?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

После некоторого разговора я понимаю, что ваш вопрос состоит из двух разных частей. Один из них заключается в том, как печатать упакованные данные в виде читаемого человеком шестнадцатеричного формата, похожего на python. Другой - как правильно обрабатывать значения с плавающей точкой в ​​msgpack.

Вот код для ответа на две части.

#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;
}

Демонстрация забега: https://wandbox.org/permlink/DanDq9QTW6JZ6MO0

Функция hex_dump() выводит std :: string в ostream в формате шестнадцатеричного дампа.

Вы можете использовать значение с плавающей точкой, аналогичное int. Большой разницы нет.

0 голосов
/ 07 ноября 2018

msgpack::pack записывает упакованное содержимое в свой первый параметр типа std::stringstream, поэтому его легко распечатать:

msgpack::pack(ss, v)
std::string string_buffer = ss.str()
std::cout << s << '\n';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...