No encontré nada directamente relacionado en la búsqueda, así que por favor perdone si es un duplicado.serialize any data type como vector <uint8_t> - use reinterpret_cast?
Lo que quiero hacer es serializar los datos a través de una conexión de red. Mi enfoque es convertir todo lo que necesito para transferir a un std::vector<uint8_t>
y en el lado de recepción descomprimir los datos en las variables adecuadas. Mi enfoque es el siguiente:
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);
}
Qué estoy usando como
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);
Mi preocupación es la
uint8_t * src = static_cast < uint8_t* >(static_cast < void * >(&data));
línea
(que entiendo que hacer lo mismo quereinterpret_cast
) ¿Hay una mejor manera de lograr esto sin el doble elenco?
Mi enfoque ingenuo era simplemente usar static_cast< uint8_t* >(&data)
que falló. Tengo been told in the past que reinterpret_cast
es malo. Así que me gustaría evitarlo (o la construcción que tengo actualmente) si es posible. Por favor, siempre hay uint8_t * src = (uint8_t *)(&data)
.
Sugerencias?
Así que, sí, mal nombre. Respecto al resto de su comentario: la pregunta, tal como se plantea, es una simplificación para preguntar si se debe o no reinterpretar_cast' (o similar) - Cambiaré el nombre para ser más específico. Soy consciente de las sutilezas en la transferencia de datos e internamente todo tiene un paquete/desempaquetar que esencialmente hace lo que describo arriba para sus propios datos. – ezpz