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

            Shuffy

            不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
            posts - 102, comments - 43, trackbacks - 0, articles - 19

            【大端(Big Endian)與小端(Little Endian)簡(jiǎn)介】
            Byte Endian是指字節(jié)在內(nèi)存中的組織,所以也稱它為Byte Ordering,或Byte Order。
                 對(duì)于數(shù)據(jù)中跨越多個(gè)字節(jié)的對(duì)象, 我們必須為它建立這樣的約定:
            (1) 它的地址是多少?
            (2) 它的字節(jié)在內(nèi)存中是如何組織的?
                針對(duì)第一個(gè)問(wèn)題,有這樣的解釋:
                對(duì)于跨越多個(gè)字節(jié)的對(duì)象,一般它所占的字節(jié)都是連續(xù)的,它的地址等于它所占字節(jié)最低地址。(鏈表可能是個(gè)例外, 但鏈表的地址可看作鏈表頭的地址)。
                比如: int x, 它的地址為0x100。 那么它占據(jù)了內(nèi)存中的Ox100, 0x101, 0x102, 0x103這四個(gè)字節(jié)(32位系統(tǒng),所以int占用4個(gè)字節(jié))。
                上面只是內(nèi)存字節(jié)組織的一種情況: 多字節(jié)對(duì)象在內(nèi)存中的組織有一般有兩種約定。 考慮一個(gè)W位的整數(shù)。
                它的各位表達(dá)如下:[Xw-1, Xw-2, ... , X1, X0],它的
                MSB (Most Significant Byte, 最高有效字節(jié))為 [Xw-1, Xw-2, ... Xw-8];
                LSB (Least Significant Byte, 最低有效字節(jié))為 [X7,X6,..., X0]。
                其余的字節(jié)位于MSB, LSB之間。

            LSB和MSB誰(shuí)位于內(nèi)存的最低地址, 即誰(shuí)代表該對(duì)象的地址?
            這就引出了大端(Big Endian)與小端(Little Endian)的問(wèn)題。
            如果LSB在MSB前面, 既LSB是低地址, 則該機(jī)器是小端; 反之則是大端。
            DEC (Digital Equipment Corporation,現(xiàn)在是Compaq公司的一部分)和Intel的機(jī)器(X86平臺(tái))一般采用小端。
            IBM, Motorola(Power PC), Sun的機(jī)器一般采用大端。
            當(dāng)然,這不代表所有情況。有的CPU即能工作于小端, 又能工作于大端, 比如ARM, Alpha,摩托羅拉的PowerPC。 具體情形參考處理器手冊(cè)。

            具體這類CPU是大端還是小端,應(yīng)該和具體設(shè)置有關(guān)。
            (如,Power PC支持little-endian字節(jié)序,但在默認(rèn)配置時(shí)是big-endian字節(jié)序)
            一般來(lái)說(shuō),大部分用戶的操作系統(tǒng)(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。
            所以說(shuō),Little Endian還是Big Endian與操作系統(tǒng)和芯片類型都有關(guān)系。

            Linux系統(tǒng)中,你可以在/usr/include/中(包括子目錄)查找字符串BYTE_ORDER(或
            _BYTE_ORDER, __BYTE_ORDER),確定其值。BYTE_ORDER中文稱為字節(jié)序。這個(gè)值一般在endian.h或machine/endian.h文件中可以找到,有時(shí)在feature.h中,不同的操作系統(tǒng)可能有所不同。

                      big endian是指低地址存放最高有效字節(jié)(MSB),而little endian則是低地址存放最低有效字節(jié)(LSB)。
                     用文字說(shuō)明可能比較抽象,下面用圖像加以說(shuō)明。比如數(shù)字0x12345678在兩種不同字節(jié)序CPU中的存儲(chǔ)順序如下所示:

            Big Endian

               低地址                                            高地址
               ----------------------------------------->
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               |     12     |      34    |     56      |     78    |
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

            Little Endian

               低地址                                            高地址
               ----------------------------------------->
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               |     78     |      56    |     34      |     12    |
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    從上面兩圖可以看出,采用big endian方式存儲(chǔ)數(shù)據(jù)是符合我們?nèi)祟惖乃季S習(xí)慣的.
                    為什么要注意字節(jié)序的問(wèn)題呢?你可能這么問(wèn)。當(dāng)然,如果你寫(xiě)的程序只在單機(jī)環(huán)境下面運(yùn)行,并且不和別人的程序打交道,那么你完全可以忽略字節(jié)序的存在。但是,如果你的程序要跟別人的程序產(chǎn)生交互呢?在這里我想說(shuō)說(shuō)兩種語(yǔ)言。C/C++語(yǔ)言編寫(xiě)的程序里數(shù)據(jù)存儲(chǔ)順序是跟編譯平臺(tái)所在的CPU相關(guān)的,而J***A編寫(xiě)的程序則唯一采用big endian方式來(lái)存儲(chǔ)數(shù)據(jù)。試想,如果你用C/C++語(yǔ)言在x86平臺(tái)下編寫(xiě)的程序跟別人的J***A程序互通時(shí)會(huì)產(chǎn)生什么結(jié)果?就拿上面的0x12345678來(lái)說(shuō),你的程序傳遞給別人的一個(gè)數(shù)據(jù),將指向0x12345678的指針傳給了J***A程序,由于J***A采取big endian方式存儲(chǔ)數(shù)據(jù),很自然的它會(huì)將你的數(shù)據(jù)翻譯為0x78563412。什么?竟然變成另外一個(gè)數(shù)字了?是的,就是這種后果。因此,在你的C程序傳給J***A程序之前有必要進(jìn)行字節(jié)序的轉(zhuǎn)換工作。
                 無(wú)獨(dú)有偶,所有網(wǎng)絡(luò)協(xié)議也都是采用big endian的方式來(lái)傳輸數(shù)據(jù)的。所以有時(shí)我們也會(huì)把big endian方式稱之為網(wǎng)絡(luò)字節(jié)序。當(dāng)兩臺(tái)采用不同字節(jié)序的主機(jī)通信時(shí),在發(fā)送數(shù)據(jù)之前都必須經(jīng)過(guò)字節(jié)序的轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)序后再進(jìn)行傳輸。ANSI C中提供了下面四個(gè)轉(zhuǎn)換字節(jié)序的宏。
            ·BE和LE一文的補(bǔ)完
                    我在8月9號(hào)的《Big Endian和Little Endian》一文中談了字節(jié)序的問(wèn)題,原文見(jiàn)上面的超級(jí)鏈接??墒怯信笥讶匀粫?huì)問(wèn),CPU存儲(chǔ)一個(gè)字節(jié)的數(shù)據(jù)時(shí)其字節(jié)內(nèi)的8個(gè)比特之間的順序是否也有big endian和little endian之分?或者說(shuō)是否有比特序的不同?
                 實(shí)際上,這個(gè)比特序是同樣存在的。下面以數(shù)字0xB4(10110100)用圖加以說(shuō)明。

            Big Endian

               msb                                                         lsb
               ---------------------------------------------->
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               |   1  |   0  |   1  |   1  |   0  |   1  |   0  |   0  |
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

            Little Endian

               lsb                                                         msb
               ---------------------------------------------->
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               |   0  |   0  |   1  |   0  |   1  |   1  |   0  |   1  |
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


                 實(shí)際上,由于CPU存儲(chǔ)數(shù)據(jù)操作的最小單位是一個(gè)字節(jié),其內(nèi)部的比特序是什么樣對(duì)我們的程序來(lái)說(shuō)是一個(gè)黑盒子。也就是說(shuō),你給我一個(gè)指向0xB4這個(gè)數(shù)的指針,對(duì)于big endian方式的CPU來(lái)說(shuō),它是從左往右依次讀取這個(gè)數(shù)的8個(gè)比特;而對(duì)于little endian方式的CPU來(lái)說(shuō),則正好相反,是從右往左依次讀取這個(gè)數(shù)的8個(gè)比特。而我們的程序通過(guò)這個(gè)指針訪問(wèn)后得到的數(shù)就是0xB4,字節(jié)內(nèi)部的比特序?qū)τ诔绦騺?lái)說(shuō)是不可見(jiàn)的,其實(shí)這點(diǎn)對(duì)于單機(jī)上的字節(jié)序來(lái)說(shuō)也是一樣的。
                 那可能有人又會(huì)問(wèn),如果是網(wǎng)絡(luò)傳輸呢?會(huì)不會(huì)出問(wèn)題?是不是也要通過(guò)什么函數(shù)轉(zhuǎn)換一下比特序?嗯,這個(gè)問(wèn)題提得很好。假設(shè)little endian方式的CPU要傳給big endian方式CPU一個(gè)字節(jié)的話,其本身在傳輸之前會(huì)在本地就讀出這個(gè)8比特的數(shù),然后再按照網(wǎng)絡(luò)字節(jié)序的順序來(lái)傳輸這8個(gè)比特,這樣的話到了接收端不會(huì)出現(xiàn)任何問(wèn)題。而假如要傳輸一個(gè)32比特的數(shù)的話,由于這個(gè)數(shù)在littel endian方存儲(chǔ)時(shí)占了4個(gè)字節(jié),而網(wǎng)絡(luò)傳輸是以字節(jié)為單位進(jìn)行的,little endian方的CPU讀出第一個(gè)字節(jié)后發(fā)送,實(shí)際上這個(gè)字節(jié)是原數(shù)的LSB,到了接收方反倒成了MSB從而發(fā)生混亂。

            【用函數(shù)判斷系統(tǒng)是Big Endian還是Little Endian】
            bool IsBig_Endian()
            //如果字節(jié)序?yàn)閎ig-endian,返回true;
            //反之為   little-endian,返回false
            {
                unsigned short test = 0x1122;
                if(*( (unsigned char*) &test ) == 0x11)
                   return TRUE;
            else
                return FALSE;

            }//IsBig_Endian()

            以上資料整理自:
            http://hi.baidu.com/serial_story/blog/item/7e110587c3ed8e29c75cc3c7.html
            http://qzone.qq.com/blog/574754870-1219889620

            国产精品日韩深夜福利久久| 精品国产91久久久久久久| 久久精品成人免费国产片小草| 97r久久精品国产99国产精| 久久精品嫩草影院| 久久国产成人亚洲精品影院| 2021国内久久精品| 伊人热人久久中文字幕| 久久天天躁狠狠躁夜夜不卡 | 四虎国产精品成人免费久久| 中文字幕无码av激情不卡久久| 亚洲国产精品久久久天堂| 久久99国产精品久久久| 久久综合色区| 久久99国产精品久久久| 国内精品久久久久影院薰衣草| 国产一区二区三区久久精品| 精品伊人久久久| 久久本道久久综合伊人| 国产婷婷成人久久Av免费高清 | 嫩草影院久久国产精品| 偷偷做久久久久网站| 精品久久久无码中文字幕| 久久精品国产第一区二区三区| 久久久国产亚洲精品| 久久se精品一区二区影院 | 欧美日韩中文字幕久久久不卡| 久久久久亚洲AV无码麻豆| 亚洲精品无码久久不卡| 国产午夜精品久久久久九九电影| 日产精品99久久久久久| 久久精品日日躁夜夜躁欧美| 热综合一本伊人久久精品| 久久青青国产| 久久久精品人妻无码专区不卡| 草草久久久无码国产专区| 久久99国产精品久久久| 国产精品无码久久综合| 精品午夜久久福利大片| 国产V综合V亚洲欧美久久| av国内精品久久久久影院|