2010-02-06 57 views
8

我已經看到了無數的關於字節順序和它的含義的參考。我沒有任何問題... 但是,我的編碼項目是一個簡單的遊戲,在標準的「玩家」硬件上運行在Linux和Windows上。 在這種情況下,我需要擔心排序嗎?我什麼時候需要擔心它?我的代碼是簡單的C和SDL + GL,唯一複雜的數據是基本媒體文件(png + wav + xm),遊戲數據主要是字符串,整數布爾值(用於標誌等)和靜態大小的數組。到目前爲止,沒有用戶遇到問題,所以我想知道是否需要添加檢查(稍後會完成,但IMO中存在更多緊急問題)。何時擔心排序?

+0

這個問題讓我想起了已故的通用卡斯特。不知道究竟是爲什麼... – KristoferA 2010-02-06 14:58:58

+0

如果您使用像UTF-16這樣的編碼(其中每個基本值大於1個字節),則字符串(來自資源文件)可能會出現問題。 – gnud 2010-02-06 15:02:52

+0

感謝您的回答。 這確實是開源的,但主要是希望在傳統的PC硬件上運行(所有的誠實我只是做Linux版本,因爲它是我的主要操作系統,我有更容易的時間來做它的工作量)...基本上是x86。 沒有網絡數據,保存文件是非常簡單的長字符串(我沒有添加「保存黑客防禦」......玩家最終決定,他們會作弊)。 遊戲數據已公開可供用戶編輯或拍攝。這意味着使用Mac編輯或添加圖片的人會導致崩潰或更糟? (沒有明確崩潰/調試輸出的錯誤) – GAKOKO 2010-02-06 15:05:01

回答

2

如果您的電腦是「標準玩家硬件」,那麼您不必擔心字節順序,因爲它始終是x86/x64上的小端。但是如果你想把這個項目移植到其他架構上,那麼你應該獨立設計它的字節序。

+6

這是最重要的endian問題:網絡編程。發送多字節值(如int或long)時,始終在主機和網絡字節順序之間進行轉換。 – gnud 2010-02-06 14:59:26

+0

好點,編程套接字時必須使用'hton'和類似的函數。但是你通常會使用抽象出這些差異的庫。 – AndiDog 2010-02-06 15:36:49

+0

@gnud:不,那是錯誤的。如果你期望所有的服務器和客戶端都是小端的,那麼定義包含小端多字節值的格式或協議是很方便的。每次通過網絡發送ZIP文件時都會發生這種情況,因爲PKZIP中的幻數和大小是小端,而不是網絡順序。它還沒有墜毀。如果您需要大端客戶端或服務器,則可以根據需要安全地進行字節交換。指定IP地址和端口需要'hton',並且是指定endian-safe數據格式的一種便捷方式,但它不是唯一的方法。 – 2010-02-07 01:48:37

1

如果您的遊戲需要在不同的硬件架構上運行,您只需要擔心它。如果您肯定會始終在英特爾硬件上運行,那麼您可以忘記它。如果它可以在Linux上運行,儘管許多人使用與英特爾不同的體系結構,並且最終可能不得不考慮它。

+3

此外,它只在您在計算機之間交換數據或以二進制格式存儲數據時非常重要。 – 2010-02-06 14:48:26

+0

@Georg啊好點。我忘了提及這一點。 – Cromulent 2010-02-06 14:50:12

+0

或串行傳輸數據時,您必須先選擇要發送哪個字節。 – JustJeff 2010-02-06 14:52:12

1

你是以源代碼的形式發佈你的遊戲嗎?

因爲如果您僅將遊戲作爲二進制文件發佈,那麼您確切知道您的遊戲將運行在哪個處理器系列上。此外,媒體文件,它們是用戶生成的(可能是通過關卡編輯器)還是他們真的只是自己提供的?

如果這是一個真正封閉的環境(您的分發二進制文件和遊戲資產不打算定製),那麼你知道自己對endians的風險,我個人不會欺騙它。但是,如果你要麼分發源代碼和/或希望人們定製他們的遊戲,那麼你就有可能引起關注。然而,現在大多數臺式機/筆記本電腦轉向x86,我認爲這是一個越來越小的擔憂。

+0

我有意爲用戶提供/編輯/修改/添加內容的數據文件「只是在那裏」。級別使用編輯器,但輸出是種子和長字符串(我有點習慣他們)。其餘的是程序性的。 無可否認,大多數用戶會碰到的版本將是win32版本,它將在發佈時進行預編譯。 (作爲軼事,只有我使用過Linux或源代碼版本) 謝謝你的回答。 – GAKOKO 2010-02-06 15:09:18

0

該問題發生在網絡中,以及數據如何發送以及何時在不同的處理器上進行處理,因爲不同的處理器可能在內存中以不同的方式存儲數據。

1

每當您從網絡接收/傳輸數據時,請記住將網絡和主機字節順序轉換爲/從網絡和主機字節順序轉換。應該在這裏使用C語言函數htonshtonl等或您的語言中的等同語。

每當您從文件讀取多字節值(如UTF-16字符或32位整數)時,因爲該文件可能源自具有不同字節順序的系統。如果文件是UTF 16或32,它可能有一個BOM(字節順序標記)。否則,文件格式必須以某種方式指定字節序。

0

我相信Power PC具有英特爾板的相反排列順序。可以有一個例程來設置依賴於架構的字節序?我不確定你是否真的可以知道硬件架構是在代碼中......也許有人更聰明,那麼我知道這個問題的答案。

現在,在提及您的「標準」Gamer H/W聲明時,我會說通常您會看到現成的消費者解決方案實際上是大多數標準遊戲玩家正在使用的,所以您幾乎要去以確保獲得相同的endian全面。我敢肯定有人會不同意我,但那是我的$。02

哈......我只是注意到右邊有一個鏈接,顯示了與我上面的建議有關。

Find Endianness through a c program

5

當你需要擔心的大小尾時代:

  • 您發送機器或流程之間的二進制數據(使用網絡或文件)。如果機器可能具有不同的字節順序,或者使用的協議指定了特定的字節順序(它應該),則需要處理字節順序。
  • 你有通過不同類型的指針訪問內存的代碼(比如你通過char*訪問unsigned int變量)。

如果你做了這些事情,你是否在處理字節順序,無論你是否知道它 - 可能是你通過假設它是單向或者其他方式來處理它,它可以很好地工作因爲你的代碼不必處理不同的平臺。

與此類似,您通常需要在相同情況下和類似原因下處理對齊問題。再一次,你可能會無所事事地處理它,並讓所有事情都正常工作,因爲你不必跨越平臺邊界(如果確實成爲需求,它可能會回來咬你)。