關於位元組序問題

2021-09-26 04:10:01 字數 1366 閱讀 2934

位元組序分為主機位元組序和網路位元組序。

主機位元組序主要分為兩種:大端位元組序(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;

判斷乙個機器是大序還是小序的

1

bool

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 這樣的乙...