• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            yehao's Blog

            關(guān)于網(wǎng)絡(luò)字節(jié)序

            不同的 CPU 有不同的字節(jié)序類型 這些字節(jié)序是指整數(shù)在內(nèi)存中保存的順序 這個叫做主機序 
            最常見的有兩種 

            1 
             Little endian :將低序字節(jié)存儲在起始地址 
            2 
             Big endian :將高序字節(jié)存儲在起始地址 

            LE little-endian 
            最符合人的思維的字節(jié)序 
            地址低位存儲值的低位 

            地址高位存儲值的高位 

            怎么講是最符合人的思維的字節(jié)序,是因為從人的第一觀感來說 

            低位值小,就應該放在內(nèi)存地址小的地方,也即內(nèi)存地址低位 

            反之,高位值就應該放在內(nèi)存地址大的地方,也即內(nèi)存地址高位 


            BE big-endian 
            最直觀的字節(jié)序 

            地址低位存儲值的高位 

            地址高位存儲值的低位 

            為什么說直觀,不要考慮對應關(guān)系 

            只需要把內(nèi)存地址從左到右按照由低到高的順序?qū)懗?/span> 
            把值按照通常的高位到低位的順序?qū)懗?/span> 
            兩者對照,一個字節(jié)一個字節(jié)的填充進去 


            例子:在內(nèi)存中雙字 0x01020304(DWORD) 的存儲方式 


            內(nèi)存地址 

            4000 4001 4002 4003 
            LE 04 03 02 01 
            BE 01 02 03 04 

            例子:如果我們將 0x1234abcd 寫入到以 0x0000 開始的內(nèi)存中,則結(jié)果為 

                   big-endian   little-endian
            0x0000   0x12       0xcd
            0x0001   0x23       0xab
            0x0002   0xab       0x34
            0x0003   0xcd       0x12
            x86
             
            系列 CPU 都是 little-endian 的字節(jié)序 

            網(wǎng)絡(luò)字節(jié)順序是 TCP/IP 中規(guī)定好的一種數(shù)據(jù)表示格式,它與具體的 CPU 類型、操作系統(tǒng)等無關(guān),從而可以保證數(shù)據(jù)在不同主機之間傳輸時能夠被正確解釋。網(wǎng)絡(luò)字節(jié)順序采用 big endian 排序方式。 


            為了進行轉(zhuǎn)換 bsd socket 提供了轉(zhuǎn)換的函數(shù) 有下面四個 
            htons 
             unsigned short 類型從主機序轉(zhuǎn)換到網(wǎng)絡(luò)序 
            htonl 
             unsigned long 類型從主機序轉(zhuǎn)換到網(wǎng)絡(luò)序 
            ntohs 
             unsigned short 類型從網(wǎng)絡(luò)序轉(zhuǎn)換到主機序 
            ntohl 
             unsigned long 類型從網(wǎng)絡(luò)序轉(zhuǎn)換到主機序 

            在使用 little endian 的系統(tǒng)中 這些函數(shù)會把字節(jié)序進行轉(zhuǎn)換 
            在使用 big endian 類型的系統(tǒng)中 這些函數(shù)會定義成空宏 


            同樣 在網(wǎng)絡(luò)程序開發(fā)時 或是跨平臺開發(fā)時 也應該注意保證只用一種字節(jié)序 不然兩方的解釋不一樣就會產(chǎn)生 bug.

            注: 

            1 
            、網(wǎng)絡(luò)與主機字節(jié)轉(zhuǎn)換函數(shù) :htons ntohs htonl ntohl (s 就是 short l  long h  host n  network)
            2
             、不同的 CPU 上運行不同的操作系統(tǒng),字節(jié)序也是不同的,參見下表。 

            處理器      操作系統(tǒng)      字節(jié)排序 
            Alpha     
            全部      Little endian
            HP-PA     NT     Little endian
            HP-PA     UNIX     Big endian
            Intelx86    
             全部      Little endian <-----x86 系統(tǒng)是小端字節(jié)序系統(tǒng) 

            Motorola680x()     
            全部      Big endian
            MIPS     NT     Little endian
            MIPS     UNIX     Big endian
            PowerPC     NT     Little endian
            PowerPC    
              NT     Big endian   <-----PPC 系統(tǒng)是大端字節(jié)序系統(tǒng) 

            RS/6000     UNIX     Big endian
            SPARC     UNIX     Big endian
            IXP1200 ARM
             
            核心      全部      Little endian

            2.

            一、字節(jié)序定義

            字節(jié)序,顧名思義字節(jié)的順序,再多說兩句就是大于一個字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序(一個字節(jié)的數(shù)據(jù)當然就無需談順序的問題了)。

            其實大部分人在實際的開發(fā)中都很少會直接和字節(jié)序打交道。唯有在跨平臺以及網(wǎng)絡(luò)程序中字節(jié)序才是一個應該被考慮的問題。

            在所有的介紹字節(jié)序的文章中都會提到字節(jié)序分為兩類:Big-Endian和Little-Endian。引用標準的Big-Endian和Little-Endian的定義如下:
            a) Little-Endian就是低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。
            b) Big-Endian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。
            c) 網(wǎng)絡(luò)字節(jié)序:4個字節(jié)的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。這種傳輸次序稱作大端字節(jié)序。由于 TCP/IP首部中所有的二進制整數(shù)在網(wǎng)絡(luò)中傳輸時都要求以這種次序,因此它又稱作網(wǎng)絡(luò)字節(jié)序。比如,以太網(wǎng)頭部中2字節(jié)的“
             以太網(wǎng)幀類型”,表示后面數(shù)據(jù)的類型。對于ARP請求或應答的以太網(wǎng)幀類型 來說,在網(wǎng)絡(luò)傳輸時,發(fā)送的順序是0x08,0x06。在內(nèi)存中的映象如下圖所示:
            棧底 (高地址)
            ---------------
            0x06 -- 低位 
            0x08 -- 高位
            ---------------
            棧頂 (低地址)
            該字段的值為0x0806。按照大端方式存放在內(nèi)存中。

            二、高/低地址與高低字節(jié)

            首先我們要知道我們C程序映像中內(nèi)存的空間布局情況:在《C專家編程》中或者《Unix環(huán)境高級編程》中有關(guān)于內(nèi)存空間布局情況的說明,大致如下圖:
            ----------------------- 最高內(nèi)存地址 0xffffffff
            | 棧底
            .
            .              棧
            .
            棧頂
            -----------------------
            |
            |
            /|/

            NULL (空洞)

            /|/
            |
            |
            -----------------------
                            堆
            -----------------------
            未初始化的數(shù)據(jù)
            ----------------(統(tǒng)稱數(shù)據(jù)段)
            初始化的數(shù)據(jù)
            -----------------------
            正文段(代碼段)
            ----------------------- 最低內(nèi)存地址 0x00000000

            以上圖為例如果我們在棧上分配一個unsigned char buf[4],那么這個數(shù)組變量在棧上是如何布局的呢[注1]?看下圖:
            棧底 (高地址)
            ----------
            buf[3]
            buf[2]
            buf[1]
            buf[0]
            ----------
            棧頂 (低地址)

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

            高低地址和高低字節(jié)都弄清了。我們再來回顧一下Big-Endian和Little-Endian的定義,并用圖示說明兩種字節(jié)序:
            以unsigned int value = 0x12345678為例,分別看看在兩種字節(jié)序下其存儲情況,我們可以用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) -- 低位
            ---------------
            棧頂 (低地址)

            在現(xiàn)有的平臺上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。

            三、例子

            嵌入式系統(tǒng)開發(fā)者應該對Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU對操作數(shù)的存放方式是從低字節(jié)到高字節(jié),而Big-endian模式對操作數(shù)的存放方式是從高字節(jié)到低字節(jié)。

            例如,16bit寬的數(shù)0x1234在Little-endian模式CPU內(nèi)存中的存放方式(假設(shè)從地址0x4000開始存放)為:

            內(nèi)存地址 存放內(nèi)容
            0x4001    0x12
            0x4000    0x34

            而在Big-endian模式CPU內(nèi)存中的存放方式則為:

            內(nèi)存地址 存放內(nèi)容
            0x4001    0x34
            0x4000    0x12

            32bit寬的數(shù)0x12345678在Little-endian模式CPU內(nèi)存中的存放方式(假設(shè)從地址0x4000開始存放)為:

            內(nèi)存地址 存放內(nèi)容
            0x4003     0x12
            0x4002     0x34
            0x4001     0x56
            0x4000     0x78

            而在Big-endian模式CPU內(nèi)存中的存放方式則為:

            內(nèi)存地址 存放內(nèi)容
            0x4003     0x78
            0x4002     0x56
            0x4001     0x34
            0x4000     0x12


            網(wǎng)絡(luò)傳輸一般采用大端序,也被稱之為網(wǎng)絡(luò)字節(jié)序,或網(wǎng)絡(luò)序IP協(xié)議中定義大端序為網(wǎng)絡(luò)字節(jié)序。 
            http://blog.csdn.net/zhaojiangwei102/article/details/4532184

            posted on 2012-03-07 11:13 厚積薄發(fā) 閱讀(970) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程

            導航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            亚洲人成无码久久电影网站| 一级做a爰片久久毛片毛片| 精品伊人久久久| 久久免费视频一区| 久久99精品国产99久久6| 91精品国产综合久久四虎久久无码一级| 一本色道久久88—综合亚洲精品 | 久久99精品久久久久久| 色偷偷88888欧美精品久久久| 囯产精品久久久久久久久蜜桃 | 精品综合久久久久久888蜜芽| 日韩乱码人妻无码中文字幕久久 | 伊人久久无码精品中文字幕| 久久一区二区免费播放| 久久人妻无码中文字幕| 99久久国产精品免费一区二区| 2021最新久久久视精品爱| 亚洲精品无码专区久久久| 精品久久久久久久无码| 久久久久久综合一区中文字幕| 很黄很污的网站久久mimi色| 久久婷婷五月综合色99啪ak| 国内精品伊人久久久久777| 久久亚洲欧美国产精品| segui久久国产精品| 欧美黑人激情性久久| 99国产欧美精品久久久蜜芽| 久久久久亚洲AV无码专区桃色| 怡红院日本一道日本久久 | 国产美女亚洲精品久久久综合| 久久国产亚洲精品无码| 精品无码人妻久久久久久| 国内精品综合久久久40p| 国产福利电影一区二区三区久久久久成人精品综合 | 中文字幕久久精品| 成人妇女免费播放久久久| 99久久无码一区人妻| 伊人久久亚洲综合影院| 99久久婷婷国产综合亚洲| 久久久久国产视频电影| 久久人妻无码中文字幕|