Как отобразить упакованную структуру сообщения

Я пытаюсь преобразовать структуру в 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;
}

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

-1

Решение

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

msgpack::pack(ss, v)
std::string string_buffer = ss.str()
std::cout << s << '\n';
0

Другие решения

После некоторого разговора я понимаю, что ваш вопрос содержит две разные части.
Один из них заключается в том, как печатать упакованные данные в читабельном шестнадцатеричном формате, похожем на 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;
}

Runnning Demo: https://wandbox.org/permlink/DanDq9QTW6JZ6MO0

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

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

0