Как сериализовать данные в бинарный формат? Имеется некий объект. В объекте есть всякого рода данные начиная от булевых переменных и заканчивая строками. Как это все хозяйство сериализовать в объект без лишнего оверхеда? Причем чтобы еще порядок байт поменялся в big endian.
Вот у меня есть структура:struct Point {
int x;
int y;
int z;
std::string name;
};
// заполним ее
Point point;
point.x = 5;
point.y = 10;
point.z = 7;
point.name = "test";
Теперь я хочу сделать что-то типа:std::vector buff = serializer::to_binary(point);
И получить в итоге хочу это:// мы сериализовали данные в бинарный формат
0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x07 0x74 0x65 0x73 0x74 0x00
Какими путями можно этого достичь? Понятное дело, что вряд ли есть решение, которое может сделать вот прям все сразу так, как я хочу. Но вдруг кто-то знает связку чего-нибудь, чтобы достичь такого эффекта. Всякие Boost.Serialization не предлагать. Изменение формата тоже не предлагать. Писать руками, конвертировать порядок байт всякими там htons, htonl и т.д. - нет, спасибо.

21 Авг 2019 в 06:41
193 +1
1
Ответы
1

Один из способов сериализации структуры в бинарный формат включает в себя использование указателя на память на которой расположены данные структуры, чтобы превратить их в последовательность байтов.

Промежуточная структура, которая используется для создания бинарного представления данных, должна содержать буфер размера, достаточного для сохранения всех данных структуры в нужном порядке байтов (big endian в вашем случае).

Пример такой реализации:

#include <iostream>
#include <vector>
#include <string>
struct Point {
int x;
int y;
int z;
std::string name;
};
// Функция для сериализации данных структуры в бинарный формат
std::vector<unsigned char> to_binary(const Point& point) {
std::vector<unsigned char> buff(sizeof(int)*3 + point.name.size() + 1);
int x = htonl(point.x);
int y = htonl(point.y);
int z = htonl(point.z);
std::copy(reinterpret_cast<const unsigned char*>(&x),
reinterpret_cast<const unsigned char*>(&x) + sizeof(int),
buff.begin());
std::copy(reinterpret_cast<const unsigned char*>(&y),
reinterpret_cast<const unsigned char*>(&y) + sizeof(int),
buff.begin() + sizeof(int));
std::copy(reinterpret_cast<const unsigned char*>(&z),
reinterpret_cast<const unsigned char*>(&z) + sizeof(int),
buff.begin() + sizeof(int)*2);
std::copy(point.name.begin(), point.name.end(), buff.end() - point.name.size() - 1);
buff.back() = '\0'; // null-terminated string
return buff;
}
int main() {
Point point;
point.x = 5;
point.y = 10;
point.z = 7;
point.name = "test";
std::vector<unsigned char> buff = to_binary(point);
for (const auto& byte : buff) {
std::cout << "0x" << std::hex << static_cast<int>(byte) << " ";
}
return 0;
}

Этот код сериализует объект Point в бинарный формат, приводя порядок байтов к big-endian и выведет в консоль последовательность байтов в виде шестнадцатеричных чисел.

Обратите внимание, что использование htonl() преобразует значения int в network byte order (big-endian) и затем копирует байты в буфер.

20 Апр в 13:14
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир