Я не нашел ничего, что напрямую связано с поиском, поэтому, пожалуйста, прости, если это дубликат.
Я хочу сериализовать данные через сетевое соединение.Мой подход состоит в том, чтобы преобразовать все, что мне нужно, в std::vector< uint8_t >
и на принимающей стороне распаковать данные в соответствующие переменные.Мой подход выглядит следующим образом:
template <typename T>
inline void pack (std::vector< uint8_t >& dst, T& data) {
uint8_t * src = static_cast < uint8_t* >(static_cast < void * >(&data));
dst.insert (dst.end (), src, src + sizeof (T));
}
template <typename T>
inline void unpack (vector <uint8_t >& src, int index, T& data) {
copy (&src[index], &src[index + sizeof (T)], &data);
}
который я использую как
vector< uint8_t > buffer;
uint32_t foo = 103, bar = 443;
pack (buff, foo);
pack (buff, bar);
// And on the receive side
uint32_t a = 0, b = 0;
size_t offset = 0;
unpack (buffer, offset, a);
offset += sizeof (a);
unpack (buffer, offset, b);
Меня беспокоит линия
uint8_t * src = static_cast < uint8_t* >(static_cast < void * >(&data));
(что я понимаю, чтобы сделать то же самое, что и reinterpret_cast
).Есть ли лучший способ сделать это без двойного приведения?
Мой наивный подход состоял в том, чтобы просто использовать static_cast< uint8_t* >(&data)
, который потерпел неудачу.Мне говорили в прошлом , что reinterpret_cast
- это плохо.Поэтому я хотел бы избежать этого (или конструкции, которую я имею в настоящее время), если это возможно.
Конечно, всегда есть uint8_t * src = (uint8_t *)(&data)
.
Предложения?