位元組序分為主機位元組序和網路位元組序。
主機位元組序主要分為兩種:大端位元組序(big-endian)和小端位元組序(little-endian)。不同的處理器架構,有不同的位元組序。
執行在同一臺計算機上的程序相互通訊時,一般不用考慮位元組序問題。
位元組序是乙個處理器架構特性,用於指示像整數這樣的大資料型別的在記憶體中的內部位元組順序。
大端位元組序(big-endian),最高有效位(msb, most significant bit)儲存在最低的記憶體位址處;(大端位元組序最直觀)
nn+1
n+2n+3
msb lsb
小端位元組序(little-endian),最低有效位(lsb,least significant bit)儲存在最低的記憶體位址處;(小端位元組序最符合人正常邏輯思維)
n+3n+2
n+1n
msb lsb
注意:1.不管位元組如何排序,數字最高位總是在左邊,最低位總是在右邊;
2.msb(全大寫)有時也指the most significant byte,指多位元組序列中具有最大權重的位元組;
例如:如果給定乙個32位整數:0x04030201, 不管位元組如何排序,數字最高位包含4,數字最低位包含1.
如果將乙個字元指標p強制轉換到這個整數的位址,將會看到位元組序帶來的不同。
(1)在小端位元組序的處理器上,p[0]指向數字最低位1,p[3]指向數字最高位4;
(2)在大端位元組序的處理器上,p[0]指向數字最高位4,p[3]指向數字最低位1;
網路位元組序是網路協議指定的,根據協議,異構計算機系統之間可以交換資訊而不會混淆位元組序。
根據tdp/ip協議棧,採用大端位元組序。所以需要用到處理器位元組序和網路位元組序之間的轉換。
對於tcp/ip應用程式,有以下四個函式實現處理器位元組序和網路位元組序的轉換:
#include
uint32_t htonl(uint32_t hostint32);
uint16_t htons(uint16_t hostint16);
返回以網路位元組序表示的32位或16位整形數;
uint32_t ntohl(uint32_t netint32);
uint16_t ntohs(uint16_t netint16);
返回以主機位元組序表示的32位或16位整形數;
注:h: host; n: network; l: long; s: short;
判斷乙個機器是大序還是小序的
1bool
isbigendian()2注:
程式忘記從哪個**看的了,原創者可以聯絡我
關於位元組序的問題
談到位元組序的問題,必然牽涉到兩大cpu派系。那就是motorola的powerpc系列cpu和intel的x86系列cpu。powerpc系列採用big endian方式儲存資料,而x86系列則採用little endian方式儲存資料。那麼究竟什麼是big endian,什麼又是little e...
關於大字節序和小字節序
大字節序 計算機體系結構中一種描述多位元組儲存順序的術語,在這種機制中最重要位元組 msb 存放在最低端的位址上。採用這種機制的處理器有ibm3700系列 pdp 10 mortolora微處理器系列和絕大多數的risc處理器。把高有效位放在低位址段,例如在按位元組定址的儲存器中往位址 0x0001...
關於網路位元組序和主機位元組序
什麼是位元組序?是指整數在記憶體中儲存的順序。位元組序有兩種 a.little endinan 低位儲存在記憶體的低位址,高位儲存在記憶體的高位址 b.big endian 高位儲存在記憶體的低位址,低位儲存在記憶體的高位址 舉個簡單的例子 dword dwcount 0x01020304 這樣的乙...