大端小端規(guī)則_第1頁(yè)
大端小端規(guī)則_第2頁(yè)
大端小端規(guī)則_第3頁(yè)
大端小端規(guī)則_第4頁(yè)
大端小端規(guī)則_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余9頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Intel 是小端規(guī)則 Motorola 680x0 是大端規(guī)則 在各種計(jì)算機(jī)體系結(jié)構(gòu)中,對(duì)于字節(jié)、字等的存儲(chǔ)機(jī)制有所不同,因而引 發(fā)了計(jì)算機(jī)通信領(lǐng)域中一個(gè)很重要的問(wèn)題,即通信雙方交流的信息單元(比 特、字節(jié)、字、雙字等等)應(yīng)該以什么樣的順序進(jìn)行傳送。如果不達(dá)成一致的 規(guī)則,通信雙方將無(wú)法進(jìn)行正確的編 / 譯碼從而導(dǎo)致通信失敗。目前在各種體系 的計(jì)算機(jī)中通常采用的字節(jié)存儲(chǔ)機(jī)制主要有兩種:Big-Endian和Little-Endian,下面先從字節(jié)序說(shuō)起。、什么是字節(jié)序字節(jié)序,顧名思義字節(jié)的順序,再多說(shuō)兩句就是大于一個(gè)字節(jié)類型的數(shù)據(jù) 在內(nèi)存中的存放順序 (一個(gè)字節(jié)的數(shù)據(jù)當(dāng)然就無(wú)需談順序的問(wèn)題了

2、 )。其實(shí)大部分 人在實(shí)際的開發(fā)中都很少會(huì)直接和字節(jié)序打交道。唯有在跨平臺(tái)以及網(wǎng)絡(luò)程序 中字節(jié)序才是一個(gè)應(yīng)該被考慮的問(wèn)題。在所有的介紹字節(jié)序的文章中都會(huì)提到字節(jié)序分為兩類:Big-Endian和 Little-Endian,引用標(biāo)準(zhǔn)的 Big-Endian和 Little-Endian 的定義如 下:a) Little-E ndian就是低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存 的高地址端。b)Big-E ndian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的 高地址端。c)網(wǎng)絡(luò)字節(jié)序:TCP/IP各層協(xié)議將字節(jié)序定義為 Big-Endian因此TCP/IP協(xié)議中使用的字節(jié)

3、序通常稱之為網(wǎng)絡(luò)字節(jié)序。1.1 什么是高 / 低地址端首先我們要知道我們 C 程序映像中內(nèi)存的空間布局情況:在C專家編程中或者Unix環(huán)境高級(jí)編程中有關(guān)于內(nèi)存空間布局情況的說(shuō)明,大致如下圖:最高內(nèi)存地址 0xffff棧底棧棧頂NULL (空洞 )未初始化的數(shù)據(jù)初始化的數(shù)據(jù)正文段 (代碼段)最低內(nèi)存地址 0x0000以上圖為例如果我們?cè)跅I戏峙湟粋€(gè)un sig ned char buf4,那么這個(gè)數(shù)組變量在棧上是如何布局的呢?看下圖:棧底(高地址)buf3buf2buf1buf0棧頂(低地址)1.2 什么是高 / 低字節(jié)現(xiàn)在我們弄清了高 /低地址,接著考慮高 / 低字節(jié)。有些文章中稱低位字節(jié)為最

4、低有效位,高位字節(jié)為最高有效位。如果我 們有一個(gè)32位無(wú)符號(hào)整型0X,那么高位是什么,低位又是什么呢?其實(shí)很簡(jiǎn) 單。在十進(jìn)制中我們都說(shuō)靠左邊的是高位,靠右邊的是低位,在其他進(jìn)制也是 如此。就拿0x來(lái)說(shuō),從高位到低位的字節(jié)依次是 0x12、0x34、0x56 和 0x78。高/低地址端和高/低字節(jié)都弄清了。我們?cè)賮?lái)回顧一下Big-Endian和Little-En dian的定義,并用圖示說(shuō)明兩種字節(jié)序:以u(píng)nsignedintvalue=0x為例,分別看看在兩種字節(jié)序下其存儲(chǔ)情況,我們可以用 unsigned char buf4來(lái)表示 value:Big-Endian:低地址存放高位,如下圖:棧

5、底(高地址)buf3 (0x78) -低位buf2 (0x56)buf1 (0x34)buf0 (0x12) -高位棧頂(低地址)Little-Endian:低地址存放低位,如下圖:棧底(高地址)buf3 (0x12) -高位buf2 (0x34)buf1 (0x56)buf0 (0x78) -低位棧頂(低地址)二、各種 Endian2.1 Big-Endian計(jì)算機(jī)體系結(jié)構(gòu)中一種描述多字節(jié)存儲(chǔ)順序的術(shù)語(yǔ),在這種機(jī)制中最重要字節(jié)(MSB)存放在最低端的地址上。采用這種機(jī)制的處理器有IBM3700系列、 PDP-10、Mortolora微處理器系列和絕大多數(shù)的 RISC處理器。| 0x34 |&

6、lt;- 0x00021| 0x12 |<- 0x00020圖1 雙字節(jié)數(shù)0x1234以Big-Endian的方式存在起始地址 0x00020中在Big-Endian中,對(duì)于bit序列中的序號(hào)編排方式如下(以雙字節(jié)數(shù)0x8B8A為例):bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1415val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |圖2: Big-Endian的bit序列編碼方式2.2 Little-Endian計(jì)算機(jī)體系結(jié)構(gòu)中一種描述多字節(jié)存儲(chǔ)順序的術(shù)語(yǔ),在這種機(jī)制中最不重要字節(jié)(LSB存放在最低端的地址上。采用這種機(jī)制的

7、處理器有PDP-11、VAX In tel系列微處理器和一些網(wǎng)絡(luò)通信設(shè)備。該術(shù)語(yǔ)除了描述多字節(jié) 存儲(chǔ)順序外還常常用來(lái)描述一個(gè)字節(jié)中各個(gè)比特的排放次序。| 0x12 |<- 0x00021| 0x34|<-0x00020圖3:雙字節(jié)數(shù)0x1234以Little-Endian的方式存在起始地址 0x00020中在Little-Endian中,對(duì)于bit序列中的序號(hào)編排和Big-Endian剛好相反,其方式如下(以雙字節(jié)數(shù)0x8B8A為例):bit1514 13 12 11 10 9 8 7 6 5 4 3 2 1 0val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0

8、 1 0 |圖 4:Little-Endian 的 bit 序列編碼方式注2:通常我們說(shuō)的主機(jī)序(HostOrder)就是遵循Little-Endian規(guī)則。所以 當(dāng)兩臺(tái)主機(jī)之間要通過(guò)TCP/IP協(xié)議進(jìn)行通信的時(shí)候就需要調(diào)用相應(yīng)的函數(shù)進(jìn)行 主機(jī)序(Little-Endian)和網(wǎng)絡(luò)序(Big-Endian)的轉(zhuǎn)換。注 3:正因?yàn)檫@兩種機(jī)制對(duì)于同一 bit 序列的序號(hào)編排方式恰恰相反,所以現(xiàn)代英漢詞典中對(duì) MSB的翻譯為 最高有效位”欠妥,故本文定義為 最重要 的 bit/byte 。”2.3 Middle-Endian除了 Big-Endian和Little-Endian之外的多字節(jié)存儲(chǔ)順序就

9、是 Middle-Endian, 比如以 4 個(gè)字節(jié)為例:象以3-4-1-2或者2-1-4-3這樣的順序存儲(chǔ)的就是 Middle-Endian。這種存儲(chǔ) 順序偶爾會(huì)在一些小型機(jī)體系中的十進(jìn)制數(shù)的壓縮格式中出現(xiàn)。嵌入式系統(tǒng)開發(fā)者應(yīng)該對(duì) Little-endian 和 Big-endian 模式非常了解。采用Little-endian模式的CPU對(duì)操作數(shù)的存放方式是從低字節(jié)到高字節(jié),而Big-endian模式對(duì)操作數(shù)的存放方式是從高字節(jié)到低字節(jié)。32bit寬的數(shù)Ox在Little-endian模式CPU內(nèi)存中的存放方式(假設(shè)從地址 0x4000開始存放)為:內(nèi)存地址 0x4000存放內(nèi)容 0x78

10、而在Big- endian模式CPU內(nèi)存中的存放方式則為:內(nèi)存地址 0x4000存放內(nèi)容 0x12三、Big-Endian和 Little-Endian 優(yōu)缺點(diǎn)0x40010x340x40020x560x40030x780x40010x560x40020x340x40030x12Big-E ndian 優(yōu)點(diǎn):靠首先提取高位字節(jié),你總是可以由看看在偏移位置為 0 的字節(jié)來(lái)確定這 個(gè)數(shù)字是正數(shù)還是負(fù)數(shù)。你不必知道這個(gè)數(shù)值有多長(zhǎng),或者你也不必過(guò)一些字 節(jié)來(lái)看這個(gè)數(shù)值是否含有符號(hào)位。這個(gè)數(shù)值是以它們被打印出來(lái)的順序存放 的,所以從二進(jìn)制到十進(jìn)制的函數(shù)特別有效。因而,對(duì)于不同要求的機(jī)器,在 設(shè)計(jì)存取方式

11、時(shí)就會(huì)不同。Little-Endian 優(yōu)點(diǎn):提取一個(gè),兩個(gè),四個(gè)或者更長(zhǎng)字節(jié)數(shù)據(jù)的匯編指令以與其他所有格式相同的方式進(jìn)行:首先在偏移地址為 0 的地方提取最低位的字節(jié),因?yàn)榈刂菲坪妥止?jié)數(shù)是一對(duì)一的關(guān)系,多重精度的數(shù)學(xué)函數(shù)就相對(duì)地容易寫了。如果你增加數(shù)字的值,你可能在左邊增加數(shù)字(高位非指數(shù)函數(shù)需要更多 的數(shù)字)。因此,經(jīng)常需要增加兩位數(shù)字并移動(dòng)存儲(chǔ)器里所有Big-e ndian順序的數(shù)字,把所有數(shù)向右移,這會(huì)增加計(jì)算機(jī)的工作量。不過(guò),使用 Little- Endian 的 存儲(chǔ)器中不重要的字節(jié)可以存在它原來(lái)的位置,新的數(shù)可以存在它的右邊的高 位地址里。這就意味著計(jì)算機(jī)中的某些計(jì)算可以變得更

12、加簡(jiǎn)單和快速。四、如何檢查處理器是 Big-Endian還是Little-Endian?由于聯(lián)合體 union 的存放順序是所有成員都從低地址開始存放,利用該特 性就可以輕松地獲得了 CPU對(duì)內(nèi)存采用Little- endian還是Big-endian模式讀 寫。例如:int checkCPUendian() union unsigned int a;unsigned char b;c;c.a = 1;return (c.b = 1); /*return 1 :little-endian, return 0:big-endian*/五、Big-Endian和 Little-Endian 轉(zhuǎn)換現(xiàn)

13、有的平臺(tái)上In tel的X86采用的是Little-E ndia n,而像Sun的SP ARC采用 的就是Big-Endiano那么在跨平臺(tái)或網(wǎng)絡(luò)程序中如何實(shí)現(xiàn)字節(jié)序的轉(zhuǎn)換呢?這個(gè) 通過(guò)C語(yǔ)言的移位操作很容易實(shí)現(xiàn),例如下面的宏:#if defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN) #define htons(A) (A) #define htonl(A) (A)#define ntohs(A) (A)#define ntohl(A) (A)#elif defined(LITTLE_ENDIAN) && !defin

14、ed(BIG_ENDIAN)#define htons(A) (uint16)(A) & 0xff00) >> 8) | (uint16)(A) & 0x00ff) << 8)#define htonl(A)0x00ff00) >> 8) | (uint32)(A) & 0xff000) >> 24) | (uint32)(A) &(uint32)(A) & 0x00ff00) << 8) | (uint32)(A) & 0x000ff) << 24)#define ntoh

15、s htons#define ntohl htohl#else#error "Either BIG_ENDIAN or LITTLE_ENDIAN must be #defined, but notboth."網(wǎng)絡(luò)字節(jié)順序1、字節(jié)內(nèi)的比特位不受這種順序的影響比如一個(gè)字節(jié)10000 (或表示為十六進(jìn)制80H)不管是什么順序其內(nèi)存中的 表示法都是這樣。2、大于 1 個(gè)字節(jié)的數(shù)據(jù)類型才有字節(jié)順序問(wèn)題比如Byte A,這個(gè)變量只有一個(gè)字節(jié)的長(zhǎng)度,所以根據(jù)上一條沒有字節(jié)順 序問(wèn)題。所以字節(jié)順序是 “字節(jié)之間的相對(duì)順序 ”的意思。3、大于 1 個(gè)字節(jié)的數(shù)據(jù)類型的字節(jié)順序有兩種比如sho

16、rtB,這是一個(gè)兩字節(jié)的數(shù)據(jù)類型,這時(shí)就有字節(jié)之間的相對(duì)順序 問(wèn)題了。網(wǎng)絡(luò)字節(jié)順序是 所見即所得”的順序。而In tel類型的CPU的字節(jié)順序與此 相反。比如上面的short B=0102H十六進(jìn)制,每?jī)晌槐硎疽粋€(gè)字節(jié)的寬度)。所見 到的是“0102,”按一般數(shù)學(xué)常識(shí),數(shù)軸從左到右的方向增加,即內(nèi)存地址從左 到右增加的話,在內(nèi)存中這個(gè)short B的字節(jié)順序是:01 02這就是網(wǎng)絡(luò)字節(jié)順序。所見到的順序和在內(nèi)存中的順序是一致的!假設(shè)通過(guò)抓包得到網(wǎng)絡(luò)數(shù)據(jù)的兩個(gè)字節(jié)流為:01 02而相反的字節(jié)順序就不同了,其在內(nèi)存中的順序?yàn)?02 01如果這表示兩個(gè)Byte類型的變量,那么自然不需要考慮字節(jié)順序的

17、問(wèn)題。 如果這表示一個(gè) short 變量,那么就需要考慮字節(jié)順序問(wèn)題。根據(jù)網(wǎng)絡(luò)字節(jié)順序 “所見即所得 ”的規(guī)則,這個(gè)變量的值就是: 0102假設(shè)本地主機(jī)是 Intel 類型的,那么要表示這個(gè)變量,有點(diǎn)麻煩:定義變量shortX,字節(jié)流地址為:pt,按順序讀取內(nèi)存是為x=*(short*)pt);那么X的內(nèi)存順序當(dāng)然是01 02按 非“所見即所得 ”的規(guī)則,這個(gè)內(nèi)存順序和看到的一樣顯然是不對(duì)的,所以要把 這兩個(gè)字節(jié)的位置調(diào)換。調(diào)換的方法可以自己定義,但用已經(jīng)有的API還是更為方便。網(wǎng)絡(luò)字節(jié)順序與主機(jī)字節(jié)順序NBO 與 HBO 網(wǎng)絡(luò)字節(jié)順序 NBO (Network Byte Order):按從高

18、到低的順序存儲(chǔ),在網(wǎng)絡(luò)上使用統(tǒng)一的網(wǎng)絡(luò)字節(jié)順序,可以避免兼容性問(wèn)題。主機(jī)字節(jié)順序( HBO, Host Byte Order):不同的機(jī)器HBO不相同,與CPU設(shè)計(jì)有關(guān)計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)有兩種字節(jié)優(yōu)先 順序:htonl()簡(jiǎn)述:將主機(jī)的無(wú)符號(hào)長(zhǎng)整形數(shù)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。#include <winsock.h>u_long PASCAL FAR htonl( u_long hostlong);hostlong:主機(jī)字節(jié)順序表達(dá)的 32 位數(shù)。注釋:本函數(shù)將一個(gè) 32 位數(shù)從主機(jī)字節(jié)順序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。返回值:htonlO返回一個(gè)網(wǎng)絡(luò)字節(jié)順序的值。簡(jiǎn)述:將網(wǎng)絡(luò)地址轉(zhuǎn)換成 “.點(diǎn)”隔的字符串格式。#include <winsock.h>in:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論