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) |
| Python | int.to_bytes(byteorder='big'/'little') |
| Java | ByteBuffer.order(ByteOrder.BIG_ENDIAN) |
| Node.js | Buffer.writeUInt32BE()、Buffer.writeUInt32LE() |
💡 小總結一句話:
Big Endian:看起來順、傳起來穩;Little Endian:算起來快、寫起來多