• <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>

            論大小端

               最近挺忙的,也沒時間寫點(diǎn)東西,一直在忙下一個資料片的事情,前幾天在群里見有人問關(guān)于大小端的事情,這里說一下。
               對于跨平臺的程序或者所用數(shù)據(jù)牽扯到不同平臺的程序(例如網(wǎng)絡(luò)編程),大小端字節(jié)序是個值得考慮的事情。本文主要討論一下網(wǎng)絡(luò)編程方面的大小端問題。(by peakflys)
               先來說一下幾個定義:
               a) Little-Endian就是低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。(邏輯上的低低高高)
               b) Big-Endian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。(像數(shù)據(jù)流一樣填充)
               c) 網(wǎng)絡(luò)字節(jié)序:TCP/IP各層協(xié)議將字節(jié)序定義為Big-Endian,因此TCP/IP協(xié)議中使用的字節(jié)序通常稱之為網(wǎng)絡(luò)字節(jié)序。

               因為字節(jié)序往往和具體CPU架構(gòu)有關(guān),所以 如果你知道你的程序主要用戶群是什么平臺,為了方便或者效率,你可以除了socket端口等需要在主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間轉(zhuǎn)換外,其余數(shù)據(jù)的傳遞直接無視。例如 現(xiàn)在很多端游 都是如此。因為現(xiàn)在大多數(shù)人使用的計算機(jī)都是X86體系結(jié)構(gòu)的CPU+Windows操作系統(tǒng),這部分用戶基本就是主流玩家,其他平臺的玩家,除非獲得的回報率足夠多,否則沒必要花費(fèi)太多時間關(guān)注。
               先來說一下,常見的CPU架構(gòu)的字節(jié)序吧:
                  Big Endian : PowerPC、IBM、Sun
                  Little Endian : x86、DEC
                  ARM的大小端是可選的。
               最近隨著移動終端(大多為ARM處理器)和移動互聯(lián)網(wǎng)的爆發(fā)式發(fā)展,以后的游戲平臺就不得不考慮一下大小端問題了。
               大小端問題主要涉及的是非單字節(jié)非字符串外的其余數(shù)據(jù)的表示和傳遞,如short型、int型等。判斷主機(jī)大小端的方法有很多,常見的是聯(lián)合體判斷法,代碼如下:
            01.bool isBigEndian()  
            02.{  
            03.    union
            04.    {  
            05.        int a;  
            06.        char b;  
            07.    }num;  
            08.    num.a = 0x1234;  
            09.    return ( num.b == 0x12 )   
            14.}
            出于效率考慮,我們有理由也完全應(yīng)該 把大小端的處理放在客戶端,在客戶端socket過來時把服務(wù)器主機(jī)的大小端通知給客戶端,這樣服務(wù)器就不需要改動,直接傳遞數(shù)據(jù)就行,這時候可以在客戶端代碼中封裝幾個宏,在客戶端在收到數(shù)據(jù)后,根據(jù)那些宏來判斷是否轉(zhuǎn)換以及得出轉(zhuǎn)換后的數(shù)值。大小端轉(zhuǎn)換最有效也是最常見的方法就是移位法:
            #define __SWP16(A)   (( ((uint16)(A) & 0xff00) >> 8)    | \  
            (( (uint16)(A) & 0x00ff) << 8))  

            #define __SWP32(A)   ((( (uint32)(A) & 0xff000000) >> 24) | \  
            (( (uint32)(A) & 0x00ff0000) >> 8)   | \  
            (( (uint32)(A) & 0x0000ff00) << 8)   | \  
            (( (uint32)(A) & 0x000000ff) << 24)) 
            聊了那么多,可能很多人要問 為什么 主機(jī)的字節(jié)序不統(tǒng)一呢? 這是因為 各個CPU廠商出于不同的邏輯考量,換句話說 大端和小端有其各自的優(yōu)勢。我們知道計算機(jī)正常的內(nèi)存增長方式是從低到高(當(dāng)然棧不是),取數(shù)據(jù)方式是從基址根據(jù)偏移找到他們的位置,從他們的存儲方式可以看出,大端存儲因為第一個字節(jié)就是高位,從而很容易知道它是正數(shù)還是負(fù)數(shù),對于一些數(shù)值判斷會很迅速。而小端存儲 第一個字節(jié)是它的低位,符號位在最后一個字節(jié),這樣在做數(shù)值四則運(yùn)算時從低位每次取出相應(yīng)字節(jié)運(yùn)算,最后直到高位,并且最終把符號位刷新,這樣的運(yùn)算方式會更高效,也更符合我們手算的方式。當(dāng)然這些都是自己的理解,如有不對,還望指正。
               此次評述先到此為止,要去給媳婦兒做飯吃了……

            posted on 2012-08-19 12:17 peakflys 閱讀(6010) 評論(5)  編輯 收藏 引用 所屬分類: 服務(wù)器

            評論

            # re: 論大小端 2012-08-19 20:40 zaccheo

            要去給媳婦兒做飯吃了……

            這個是亮點(diǎn)。哈哈

            樓主應(yīng)該寫個 _swp64的宏,也挺常用的  回復(fù)  更多評論   

            # re: 論大小端 2012-08-19 22:54 時間矢

            C語言socket編程中有專門的函數(shù)負(fù)責(zé)網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換的函數(shù)啊,htonl(),htons(),ntohl(),ntohs()  回復(fù)  更多評論   

            # re: 論大小端 2012-08-20 09:48 peakflys

            64位和32位道理一樣,挺好寫的,自己實現(xiàn)就okay了,呵呵 @zaccheo
              回復(fù)  更多評論   

            # re: 論大小端 2012-08-20 09:56 peakflys

            對的,那幾個函數(shù)就是為了在網(wǎng)絡(luò)字節(jié)序(也就是大端)和本地字節(jié)序間轉(zhuǎn)換的,不過它提供的只有32位和16位的數(shù)值轉(zhuǎn)換,實際項目中還會用到其他格式的數(shù)值類型,為了保證格式上的統(tǒng)一,一般都自己封裝轉(zhuǎn)換方法(其實那幾個函數(shù)的真實實現(xiàn) 也是用到上面的方法實現(xiàn)的)@時間矢
              回復(fù)  更多評論   

            # re: 論大小端 2012-08-22 15:32 Anonymous8421

            dec的vax應(yīng)該是LE, 它的alpha axp則是BE  回復(fù)  更多評論   

            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導(dǎo)航

            統(tǒng)計

            公告

            人不淡定的時候,就愛表現(xiàn)出來,敲代碼如此,偶爾的靈感亦如此……

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久综合伊人77777| 少妇久久久久久被弄高潮| 久久天天躁狠狠躁夜夜av浪潮| 久久av免费天堂小草播放| 欧美伊人久久大香线蕉综合| 久久亚洲国产精品成人AV秋霞| 久久成人国产精品| 欧美与黑人午夜性猛交久久久| 久久亚洲精品人成综合网| 久久精品国产精品亚洲| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲乱码日产精品a级毛片久久| 亚洲AV日韩AV永久无码久久| 99久久无码一区人妻| 久久青青草原亚洲av无码app| 久久精品国产亚洲av瑜伽| 精品久久久久久无码专区不卡| 亚洲伊人久久成综合人影院| 7国产欧美日韩综合天堂中文久久久久 | 国产精品一区二区久久不卡| 久久婷婷色综合一区二区| 久久精品男人影院| 国产午夜精品久久久久免费视 | 国产成人久久精品区一区二区| 嫩草影院久久99| 久久久久久伊人高潮影院| 国产精品99久久久久久人| 亚洲精品无码专区久久久 | 97精品伊人久久久大香线蕉 | 99久久精品国产高清一区二区| 热99RE久久精品这里都是精品免费 | 思思久久99热只有频精品66| 久久综合久久伊人| 亚洲乱码日产精品a级毛片久久 | 欧美与黑人午夜性猛交久久久| 欧美久久亚洲精品| 一级做a爰片久久毛片免费陪| 精品久久久久久久国产潘金莲| 欧美精品九九99久久在观看| 亚洲级αV无码毛片久久精品| 亚洲成色www久久网站夜月|