Fuchsia 客戶政策

雖然 Fuchsia 只能在小端 (LE) CPU 架構上執行,但 Fuchsia 專案仍須考量較大的端序 (BE) 問題。

本頁面將說明:

  • 末端議題出現的位置
  • 應對方式
  • 為何做出這些選擇

末端議題出現的位置

週邊裝置

許多周邊裝置硬體定義了必須轉換的多位元組 BE 值。

舊版格式

網路位元組順序為 BE。SCSI 資料結構為 BE。

大端 CPU 執行作業

即使 Fuchsia 從未在 BE CPU 上執行 (也許有一天,至少理論上),我們的部分程式碼仍可能移植到 BE CPU。

只要定義多位元組值,就會產生可能讓其他平台寫入或讀取該值的可能性,而我們的程式碼 (為開放原始碼) 可能會移植至該平台,以便執行此操作。

如何處理 C/C++ 程式碼和文件中的終端問題

如果模組不太可能發生任何端點問題

許多模組不需要採取任何行動;資料只會由執行 Fuchsia 的單一 CPU 解讀。

適用於轉移至其他作業系統,或是可透過任何管道匯出資料的機構:

C 或 C++ 的建議樣式是新增

#include <endian.h>
...
static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__);

,或加上註解,說明哪些檔案與 BE 不相容。

(可以不採取任何行動,但最好使程式碼明確表示程式碼與 BE 相容)。

如果模組必須處理結尾問題

在本質上,最好納入將小端資料「轉換」為 CPU 端點的巨集;這是自行記錄程式碼的形式。當然,大端的資料應一律使用巨集。

適用於 C/C++

最理想的樣式是使用 endian.h 的 LE16 .. BE64 巨集,包括 DDK 在內的所有地區。

#include <endian.h>
...
hw_le_struct.int_field = LE32(program_int);
program_long =  BE64(hw_be_struct.long_field);

Rust 用

如要存取位元組緩衝區中的多位元組值,請使用這個 crate。如要轉換整數值,請使用這些方法