Skip to main content

Endian

這其實是非常核心的計算機概念,很多系統問題、網路協定、跨平台 bug 都是因為 Endian

我用簡單、務實、但工程師會懂的角度來幫你講清楚:

📦 什麼是 Endian?

Endian → 位元組序(Byte Order)

就是:當你有一個超過 1 byte 的數字時,儲存順序誰在前誰在後?

因為電腦記憶體是按「byte」存,但你存的可能是 2 bytes、4 bytes、8 bytes 甚至 16 bytes 的整數或其他資料。

📊 Big Endian vs Little Endian

類型說明舉例 (以十六進位 0x12345678 為例)
Big Endian高位在前(big end 先存)12 34 56 78
Little Endian低位在前(little end 先存)78 56 34 12

🧠 為什麼有兩種?

  • Big Endian

    • 更符合人類閱讀順序(從高位到低位)
    • 常用於:網路協定 (Network Byte Order)、某些 CPU 架構(如 IBM Mainframe、部份 ARM)
  • Little Endian

    • 更符合 CPU 算數邏輯(從最低位開始運算)
    • x86 / x64 PC 都是 Little Endian(Intel / AMD / Windows / Mac M 系列)

📡 網路協定為什麼用 Big Endian?

網路上幾乎所有協定(IP、TCP、UDP、DNS、UUID RFC 4122)都定義使用 Big Endian,稱為:

Network Byte Order → Big Endian

原因:

  • 簡單一致
  • 不需要管 CPU 是哪一個平台

所以:

  • 傳輸時用 Big Endian
  • 接收時轉回自己 CPU 的 Endian

🖥 舉個活生生的例子

假設你有個 32-bit 整數: 0x12345678

  • 你的 PC (x86, Little Endian) 記憶體儲存:
78 56 34 12
  • 網路封包 (Big Endian) 傳輸時:
12 34 56 78
  • 如果你把一台 PC 上的記憶體直接丟到網路,會出錯,因為對方以為那是 Big Endian。

常見 API

很多程式語言有內建轉換函式:

語言函式
C/C++htons(), htonl(), ntohl(), ntohs() (host/network order)
Pythonint.to_bytes(byteorder='big'/'little')
JavaByteBuffer.order(ByteOrder.BIG_ENDIAN)
Node.jsBuffer.writeUInt32BE()、Buffer.writeUInt32LE()

💡 小總結一句話:

Big Endian:看起來順、傳起來穩;Little Endian:算起來快、寫起來多