2012-03-08 56 views
2

爲了節省空間,我決定使用二進制編碼我的保存文件。每個字節代表一個瓦片類型的ID。這會導致不同的Endian計算出現問題嗎?Endianness會成爲這種二進制IO操作的問題嗎?

此外,出於好奇,它是CPU或操作系統,其設置尾段類型?

附加信息:我正在使用C++並構建一個x平臺遊戲。我不想使用其他API,如Boost。

+2

「每個字節代表一個ID ...」。請注意,'字節',如char,unsigned char或uint8_t不受endian問題的影響。在字節級別,這些位全部以相同的順序。 – 2012-03-08 05:39:52

回答

5

是的,它會引起問題 - 如果 BE上保存的文件被加載到LE上,反之亦然。這就是爲什麼一些Unicode編碼(如UTF-16和UTF-32)具有所謂的字節順序標記。

如果你的代碼通常在編譯你仍然必須確保該LE代碼會利用數據的交換之前的字節順序。

CPU將端模式和一些芯片(例如,一些MIPS CPU)的允許這樣的自舉系統時被切換。

+0

謝謝,這正是我正在尋找的。 – Johnathan 2012-03-08 02:12:57

3

我們可以使用更多的信息。跨平臺是一回事,但是什麼平臺?如果您的意思是像x86 Mac,x86 Linux和x86 Windows這樣的跨平臺,那麼您不需要擔心它(儘管如果您嘗試將結構體寫入磁盤並使用不同的編譯器進行編譯,結構打包可能仍然是個問題不同的平臺)。即使你有幾個不同的OS/CPU組合,你也可以列出你想要支持的所有東西,如果它們都具有相同的字節順序,不要擔心。

如果你沒有期望保存的數據將被從平臺到平臺的移動,你也不必擔心。如果你想在一個big-endian機器上創建數據,然後在一個little-endian機器上讀取數據,或者反之亦然,Endianess只是一個問題。如果這些只是本地數據文件,那麼沒有什麼大不了的,儘管假設用戶可以將他們的存檔從一個平臺複製到另一個平臺可能是安全的,他們會這樣做,因爲他們會做很多你不想讓​​他們做的事情並不支持。

此外,由於您只提個字節,如果字節數組是你的數據將會變得複雜,你其實並不需要擔心字節序。這只是多字節數據類型的一個問題。因此,如果您只是保存字節數組,並且其餘的簿記數據也適用於字節,則沒有什麼可擔心的,但只要您保存一個short,int或float,就會有潛在的endian問題。

我個人的看法是,只要你需要序列化到字節序帳戶,但我有一個非常multplatform背景(即運送同樣的產品在5個遊戲系統)。這很簡單,交換宏已經存在,當你不可避免地決定轉移到另一個endianess時,你將不必重寫東西。如果數據更復雜或結構化,可以考慮使用協議緩衝區或BSON等庫。

CPU和操作系統都可能導致永久性。從歷史上看,它已經融入到CPU中,雖然x86仍然是小端的硬連線,但大多數現代RISC衍生產品都可以在任一模式下運行,使其成爲硬件和操作系統開發人員的選擇。

+0

我想補充一點,CPU的字大小也很重要(32位x86與64位x86_64),它們可能會影響默認打包。 – 2012-03-08 02:54:16

+0

良好的通話...包裝就像Endianess的邪惡的兄弟姐妹一樣,當你認爲你明白你的所有與內存相關的序列化問題時,包裝會發現破壞你的計劃的方法。 – Suboptimus 2012-03-08 02:58:57