2011-09-17 238 views
0

是否安全,從Windows到iPhone即是這樣寫傳的二進制文件:Windows以iPhone二進制文件

std::ostream stream = // get it somehow 
stream.write(&MyHugePODStruct, sizeof(MyHugePODStruct)); 

和念想:

std::istream stream = // get it somehow 
stream.read(&MyHugePODStruct, sizeof(MyHugePODStruct)); 

雖然MyHugePODStruct的定義是相同的?如果沒有,有沒有辦法用標準庫(包括C++ 11)序列化這個或安全地提升?有沒有更乾淨的方式,因爲它看起來像一個不可移植的代碼塊?

回答

1

不,原因很多。首先,這不會編譯,因爲您必須通過char *readwrite。其次,即使在同一個平臺上,也不能保證即使在單一平臺上也能正常工作,因爲結構可能包含填充(但是,即使在相同的平臺上,其本身在不同編譯版本的代碼之間也會有所不同)。接下來,有64/32位問題需要考慮,它們會影響許多原始類型(例如,long double被填充到x86上的12個字節,而在x64上填充到16個字節)。最後但並非最不重要的是endianness(儘管我不確定iOS的排序是什麼)。

所以總之,不,不要那樣做。

您必須分別序列化每個結構成員,並根據其數據類型。

你可能想看看Boost.serialization,雖然我沒有經驗。