大端小端規(guī)則_第1頁(yè)
大端小端規(guī)則_第2頁(yè)
大端小端規(guī)則_第3頁(yè)
大端小端規(guī)則_第4頁(yè)
大端小端規(guī)則_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ù)統(tǒng)稱數(shù)據(jù)段初始化的數(shù)據(jù)正文段 (代碼段)最低內(nèi)存地址 0x0000以上圖為例如果我們?cè)跅I戏峙湟粋€(gè)un sig ned char buf4,那么這個(gè)數(shù)組變量在棧上是如何布局的呢?看下圖:棧底(高地址)buf3buf2buf1buf0棧頂(低地址)1.2 什么是高 /低字節(jié)現(xiàn)在我們弄清了高 /低地址,接著考慮高 / 低字節(jié)。有些文章

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

5、放高位,如下圖:棧底(高地址)buf3 (Ox78) -低位buf2 (Ox56)buf1 (Ox34)bufO (Ox12) -高位棧頂(低地址)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處理器

6、。+| 0x34 |- 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 1415+val | 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存放在最低端的地址上

7、。采用這種機(jī)制的處理器有PDP-11、VAX、Intel 系列微處理器和一些網(wǎng)絡(luò)通信設(shè)備。該術(shù)語(yǔ)除了描述多字節(jié) 存儲(chǔ)順序外還常常用來(lái)描述一個(gè)字節(jié)中各個(gè)比特的排放次序。+| 0x12 |- 0x00021+| 0x34| 8) | (uint16)(A) & 0x00ff) 24) | (uint32)(A) & 0x00ff00) 8) | (uint32)(A) & 0x00ff00) 8) | (uint32)(A) & 0x000ff) 24)#define ntohs htons#define ntohl htohl#else#error Either BIG_ENDIAN or LI

8、TTLE_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ù)上一條沒(méi)有字節(jié)順 序問(wèn)題。所以字節(jié)順序是 “字節(jié)之間的相對(duì)順序 ”的意思。3、大于 1 個(gè)字節(jié)的數(shù)據(jù)類型的字節(jié)順序有兩種比如shortB,這是一個(gè)兩字節(jié)的數(shù)據(jù)類型,這時(shí)就有字節(jié)之間的相對(duì)順序 問(wèn)題了網(wǎng)絡(luò)字節(jié)順序是 所見(jiàn)即所得”的順序。而In tel類型的CPU的字節(jié)順序與此

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

10、設(shè)本地主機(jī)是 Intel 類型的,那么要表示這個(gè)變量,有點(diǎn)麻煩:定義變量shortX,字節(jié)流地址為:pt,按順序讀取內(nèi)存是為x=*(short*)pt);那么X的內(nèi)存順序當(dāng)然是01 02按 非“所見(jiàn)即所得 ”的規(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):按從高到低的順序存儲(chǔ),在網(wǎng)絡(luò)上使用統(tǒng)一的網(wǎng)絡(luò)字節(jié)順序,可以避免兼 容性問(wèn)題。主機(jī)字節(jié)順序( HBO, Host Byte Order):不同的機(jī)器H

11、BO不相同,與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 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é)順序。 返回值:hto nl()返回一個(gè)網(wǎng)絡(luò)字節(jié)順序的值。簡(jiǎn)述:將網(wǎng)絡(luò)地址轉(zhuǎn)換成 “.點(diǎn)”隔的字符串格式。#include in:注釋:返回值:11 / 13回毒 nfohs( )nfoh_(s-Hs可訐連叢片蓉3逑n甘endif琴 c-udecssiphvv

12、oidOSHO宀 short infcharxpXk八x H oxk_k22xO H (cha3QOx)oy二護(hù)連年 xl H (chaaQOx)三0M連耳 if(ox二 hh XO)宀prinff(二big endiankryose 宀 prinffQse endiarArr)char bs八oic.aHk-if(OHHC.bo)宀 prinff (二big endiankr)八 ose 宀 prinfQse endiarAsp voidCDSGSO宀 union aword 宀inf B char bs八oic.aHOX-if(oxk2HHC.boHPI1nff(=big endiankr)八2、亠3oelseprintf(lit

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論