Я пытаюсь преобразовать структуру в 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 в структуре, чтобы «значение» могло принимать значения с плавающей точкой. Я не в состоянии сделать это, хотя. Может ли кто-нибудь, пожалуйста, направить меня в этом?
msgpack::pack
записывает упакованный контент в свой первый параметр типа std::stringstream
, так что должно быть легко напечатать это:
msgpack::pack(ss, v)
std::string string_buffer = ss.str()
std::cout << s << '\n';
После некоторого разговора я понимаю, что ваш вопрос содержит две разные части.
Один из них заключается в том, как печатать упакованные данные в читабельном шестнадцатеричном формате, похожем на 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. Там нет большой разницы.