Tôi không tìm thấy bất kỳ điều gì có liên quan trực tiếp đến tìm kiếm, vì vậy vui lòng tha thứ nếu đây là bản sao.serialize bất kỳ loại dữ liệu nào như vector <uint8_t> - sử dụng reinterpret_cast?
Điều tôi muốn làm là sắp xếp từng dữ liệu qua kết nối mạng. Cách tiếp cận của tôi là chuyển đổi mọi thứ tôi cần để chuyển sang một số std::vector<uint8_t>
và bên nhận nhận giải nén dữ liệu vào các biến thích hợp. Biện pháp của tôi trông như thế này:
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);
}
Mà tôi đang sử dụng như
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);
mối quan tâm của tôi là
uint8_t * src = static_cast < uint8_t* >(static_cast < void * >(&data));
dòng
(mà tôi hiểu để làm tương tự nhưreinterpret_cast
). Có cách nào tốt hơn để thực hiện điều này mà không có dàn diễn viên đôi?
Cách tiếp cận ngây thơ của tôi là chỉ sử dụng static_cast< uint8_t* >(&data)
không thành công. Tôi đã been told in the past rằng reinterpret_cast
là xấu. Vì vậy, tôi muốn tránh nó (hoặc cấu trúc tôi hiện có) nếu có thể.
Tất nhiên, luôn có uint8_t * src = (uint8_t *)(&data)
.
Đề xuất?
Vì vậy, có, nhầm lẫn. Đối với phần còn lại của bình luận của bạn: câu hỏi, như đặt ra, là một đơn giản hóa để hỏi về việc có hay không 'reinterpret_cast' (hoặc tương tự) - Tôi sẽ đổi tên thành specfic hơn. Tôi nhận thức được sự tinh tế trong việc truyền dữ liệu và nội bộ mọi thứ đều có gói/giải nén mà về cơ bản tôi làm những gì tôi mô tả ở trên cho dữ liệu của chính nó. – ezpz