位元組序問題 大端法小端法

2021-05-22 09:14:29 字數 3086 閱讀 1824

位元組序問題--大端法小端法

一、位元組序定義

位元組序,顧名思義位元組的順序,再多說兩句就是大於乙個位元組型別的資料在記憶體中的存放順序(乙個位元組的資料當然就無需談順序的問題了)。

其實大部分人在實際的開發中都很少會直接和位元組序打交道。唯有在跨平台以及網路程式中位元組序才是乙個應該被考慮的問題。

在所有的介紹位元組序的文章中都會提到位元組序分為兩類:big-endian和little-endian。引用標準的big-endian和little-endian的定義如下:

a) little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。

b) big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。

c) 網路位元組序:4個位元組的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然後16~23bit,最後是24~31bit。這種傳輸次序稱作大端位元組序。由於tcp/ip首部中所有的二進位制整數在網路中傳輸時都要求以這種次序,因此它又稱作網路位元組序。比如,乙太網頭部中2位元組的「乙太網幀型別」,表示後面資料的型別。對於arp請求或應答的乙太網幀型別來說,在網路傳輸時,傳送的順序是0x08,0x06。在記憶體中的映象如下圖所示:

棧底 (高位址)

---------------

0x06 -- 低位 

0x08 -- 高位

---------------

棧頂 (低位址)

該字段的值為0x0806。按照大端方式存放在記憶體中。

二、高/低位址與高低位元組

首先我們要知道我們c程式映像中記憶體的空間布局情況:在《c專家程式設計》中或者《unix環境高階程式設計》中有關於記憶體空間布局情況的說明,大致如下圖:

----------------------- 最高記憶體位址 0xffffffff

| 棧底

..              棧.棧頂

-----------------------||

/|/null (空洞)

/|/|

|-----------------------

堆-----------------------

未初始化的資料

----------------(統稱資料段)

初始化的資料

-----------------------

正文段(**段)

----------------------- 最低記憶體位址 0x00000000

以上圖為例如果我們在棧上分配乙個unsigned char buf[4],那麼這個陣列變數在棧上是如何布局的呢[注1]?看下圖:

棧底 (高位址)

----------

buf[3]

buf[2]

buf[1]

buf[0]

----------

棧頂 (低位址)

現在我們弄清了高低位址,接著來弄清高/低位元組,如果我們有乙個32位無符號整型0x12345678(呵呵,恰好是把上面的那4個位元組buf看成乙個整型),那麼高位是什麼,低位又是什麼呢?其實很簡單。在十進位制中我們都說靠左邊的是高位,靠右邊的是低位,在其他進製也是如此。就拿0x12345678來說,從高位到低位的位元組依次是0x12、0x34、0x56和0x78。

高低位址和高低位元組都弄清了。我們再來回顧一下big-endian和little-endian的定義,並用圖示說明兩種位元組序:

以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其儲存情況,我們可以用unsigned char buf[4]來表示value:

big-endian: 低位址存放高位,如下圖:

棧底 (高位址)

---------------

buf[3] (0x78) -- 低位

buf[2] (0x56)

buf[1] (0x34)

buf[0] (0x12) -- 高位

---------------

棧頂 (低位址)

little-endian: 低位址存放低位,如下圖:

棧底 (高位址)

---------------

buf[3] (0x12) -- 高位

buf[2] (0x34)

buf[1] (0x56)

buf[0] (0x78) -- 低位

---------------

棧頂 (低位址)

在現有的平台上intel的x86採用的是little-endian,而像sun的sparc採用的就是big-endian。

三、例子

嵌入式系統開發者應該對little-endian和big-endian模式非常了解。採用little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組,而big-endian模式對運算元的存放方式是從高位元組到低位元組。

例如,16bit寬的數0x1234在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址  存放內容

0x4001    0x12

0x4000    0x34

而在big-endian模式cpu記憶體中的存放方式則為:

記憶體位址  存放內容

0x4001    0x34

0x4000    0x12

32bit寬的數0x12345678在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址  存放內容

0x4003     0x12

0x4002     0x34

0x4001     0x56

0x4000     0x78

而在big-endian模式cpu記憶體中的存放方式則為:

記憶體位址  存放內容

0x4003     0x78

0x4002     0x56

0x4001     0x34

0x4000     0x12

引用:http://www.mcublog.com/blog/user1/5/archives/2007/24516.html

大端法,小端法位元組序

關於位元組序 大端法 小端法 的定義 也可以說 1.小端法 little endian 就是低位位元組排放在記憶體的低位址端即該值的起始位址,高位位元組排放在記憶體的高位址端。2.大端法 big endian 就是高位位元組排放在記憶體的低位址端即該值的起始位址,低位位元組排放在記憶體的高位址端。舉...

位元組序 大端法和小端法

在幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列,物件的位址為所使用位元組中的最小位址。例如,假設乙個型別為int的變數x的位址為0x100,即 x的值為0x100。那麼x的4個位元組將被儲存在 儲存器的0x100,0x101,0x102和0x103的位置。位元組序即為多位元組物件儲存在記...

大端法 小端法 網路位元組序

unxi網路程式設計 定義 術語 小端 和 大端 表示多位元組值的哪一端 小端或大端 儲存在該值的起始位址。小端存在起始位址,即是小端位元組序 大端存在起始位址,即是大端位元組序。也可以說 1.小端法 little endian 就是低位位元組排放在記憶體的低位址端即該值的起始位址,高位位元組排放在...