我沒有發現任何直接相關的搜索,所以請原諒,如果這是重複的。將任何數據類型序列化爲矢量<uint8_t> - 使用reinterpret_cast?
我正在做的是通過網絡連接序列化數據。我的方法是將我需要轉換的所有內容轉換爲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)
失敗。我been told in the pastreinterpret_cast
是壞的。所以如果可能的話,我想避免它(或者我目前的構造)。
當然,總有uint8_t * src = (uint8_t *)(&data)
。
對此提出建議?
所以,是的,用詞不當。關於你的評論的其餘部分:正如所提出的,這個問題是詢問是否需要'reinterpret_cast'(或類似)的簡化 - 我將重新命名爲更具體。我意識到傳輸數據的細微之處,並且內部所有東西都有一個打包/解壓縮,基本上按照上面描述的爲自己的數據進行。 – ezpz 2010-07-01 20:48:48