1. 程式人生 > >主機字節序和網絡字節序

主機字節序和網絡字節序

保存 什麽 cells 方式 之間 運算 一個 高位到低位 數據表

不同的CPU有不同的字節序類型,這些字節序是指 整數 在內存中保存的順序,這個叫做 主機序。最常見的有兩種:

1Little endian:將低序字節存儲在起始地址

2Big endian:將高序字節存儲在起始地址

LE little-endian(小端)

  1. 最符合人的思維的字節序;
  2. 地址低位存儲值的低位;
  3. 地址高位存儲值的高位;
  4. 怎麽講是最符合人的思維的字節序,是因為從人的第一觀感來說;
  5. 低位值小,就應該放在內存地址小的地方,也即內存地址低位;
  6. 反之,高位值就應該放在內存地址大的地方,也即內存地址高位;

BE big-endian(大端)

1) 最直觀的字節序;

2) 地址低位存儲值的高位;

3) 地址高位存儲值的低位;

4) 為什麽說直觀,不要考慮對應關系;

5) 只需要把內存地址從左到右按照由低到高的順序寫出;

6) 把值按照通常的高位到低位的順序寫出;

7) 兩者對照,一個字節一個字節的填充進去;

例子:在內存中雙字 0x01020304(DWORD) 的存儲方式

Addr: 4000 4001 4002 4003
LE : 04 03 02 01
BE : 01 02 03 04

x86系列CPU都是little-endian的字節序。網絡字節順序采用big endian排序方式。

網絡字節順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋。

我們知道計算機正常的內存增長方式是從低到高(當然棧不是),取數據方式是從基址根據偏移找到他們的位置,從他們的存儲方式可以看出,大端存儲因為第一個字節就是高位,從而很容易知道它是正數還是負數,對於一些數值判斷會很迅速。而小端存儲 第一個字節是它的低位,符號位在最後一個字節,這樣在做數值四則運算時從低位每次取出相應字節運算,最後直到高位,並且最終把符號位刷新,這樣的運算方式會更高效。

主機字節序和網絡字節序