<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大端還是小端?

    Posted on 2006-11-07 13:29 nemo 閱讀(4857) 評(píng)論(4)  編輯  收藏

    今天研究SHA-1算法源碼,發(fā)現(xiàn)注釋中一個(gè)詞怎么也搞不懂:Big-Endian. 在網(wǎng)上查了才知道是大端在前的意思。在http://blog.vckbase.com/smileonce/archive/2005/02/22/3202.aspx?和 http://blog.myrice.com/reddenedmaple/archives/50001922.html中有比較多地介紹。但是很亂,我整理了一下,并加入了自己的一些理解。感謝提供信息的人們。

    這兩個(gè)術(shù)語(yǔ)來(lái)自于?Jonathan?Swift?的《《格利佛游記》其中交戰(zhàn)的兩個(gè)派別無(wú)法就應(yīng)該從哪一端--小端還是大端--打開一個(gè)半熟的雞蛋達(dá)成一致。
    在那個(gè)時(shí)代,Swift是在諷刺英國(guó)和法國(guó)之間的持續(xù)沖突,Danny?Cohen,一位網(wǎng)絡(luò)協(xié)議的早期開創(chuàng)者,第一次使用這兩個(gè)術(shù)語(yǔ)來(lái)指代字節(jié)順序,后來(lái)這個(gè)術(shù)語(yǔ)被廣泛接納了,成為計(jì)算機(jī)專用名詞。除網(wǎng)絡(luò)傳輸之外,在計(jì)算機(jī)硬件中也有使用,通常表示邏輯最小處理單元大于物理最小處理單元時(shí)邏輯單元與物理單元的映射方式。
    由于這個(gè)概念第一次提出時(shí)是來(lái)指代字節(jié)順序,而且計(jì)算機(jī)物理最小處理單元通常為一個(gè)字節(jié),所以通常情況下無(wú)論是大端還是小端都是以字節(jié)(8bit)計(jì),在字節(jié)之內(nèi)都是以大端順序排列。但不排除以后隨著計(jì)算機(jī)的發(fā)展將這個(gè)數(shù)字?jǐn)U充。

    字節(jié)排序含義
    Big-Endian高位在前,低位在后。
    Little-Endian低位在前,高位在后


    請(qǐng)看下面這個(gè)例子:
    如果我們將0x1234abcd寫入到以0x0000開始的內(nèi)存中,則結(jié)果為
    ??????????????? big-endian???? little-endian
    0x0000???? 0x12????????????? 0xcd
    0x0001???? 0x34????????????? 0xab
    0x0002???? 0xab????????????? 0x34
    0x0003???? 0xcd????????????? 0x12

    然后,假如需要從內(nèi)存中取32位整數(shù)0x1234abcd中的高16位整數(shù),就需要知道是不是big-endian,如果是,需要從0x0002地址中去取,如果是little-endian,則需要從0x0000中取。也即怎么存就怎么取。

    為什么會(huì)出現(xiàn)這樣的情況呢?為什么要有這兩種方式來(lái)排列數(shù)據(jù)?我們可以看看Dr. William T. Verts所作的說(shuō)明:

    Which?is?Better?

    You?may?see?a?lot?of?discussion?about?the?relative?merits?of?the?two?formats,?
    mostly?religious?arguments?based?on?the?relative?merits?of?the?PC?versus?the?Mac.?
    Both?formats?have?their?advantages?and?disadvantages.

    In?"Little?Endian"?form,?assembly?language?instructions?for?picking?up?a?1,?2,?4,?or?longer?byte?number?proceed?
    in?exactly?the?same?way?for?all?formats:?first?pick?up?the?lowest?order?byte?at?offset?0.?
    Also,?because?of?the?1:1?relationship?between?address?offset?and?byte?number?(offset?0?is?byte?0),?
    multiple?precision?math?routines?are?correspondingly?easy?to?write.

    In?"Big?Endian"?form,?by?having?the?high-order?byte?come?first,?
    you?can?always?test?whether?the?number?is?positive?or?negative?by?looking?at?the?byte?at?offset?zero.?
    You?don't?have?to?know?how?long?the?number?is,?nor?do?you?have?to?skip?over?any?bytes?to?find?the?byte?containing?the?sign?information.?
    The?numbers?are?also?stored?in?the?order?in?which?they?are?printed?out,?so?binary?to?decimal?routines?are?particularly?efficient.

    翻譯如下:
    你可能看見(jiàn)過(guò)很多關(guān)于這兩種形式的相對(duì)優(yōu)點(diǎn)的討論,最激烈的爭(zhēng)論是關(guān)于PC和MAC的相對(duì)優(yōu)點(diǎn)。這兩種形式都有其優(yōu)點(diǎn)和缺點(diǎn)。

    在“小終結(jié)者”形式中,提取一個(gè),兩個(gè),四個(gè)或者更長(zhǎng)字節(jié)數(shù)據(jù)的匯編指令以與其他所有格式相同的方式進(jìn)行:首先在偏移地址為0的地方提取最低位的字節(jié),因?yàn)榈刂菲坪妥止?jié)數(shù)是一對(duì)一的關(guān)系,多重精度的數(shù)學(xué)函數(shù)就相對(duì)地容易寫了。

    在“大終結(jié)者”的形式中,靠首先提取高位字節(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ì)存取方式時(shí)就會(huì)不同。
    IBM的370主機(jī),多數(shù)基于RISC計(jì)算機(jī),和Motorola的微處理器使用big-endian方法。TCP/IP也使用big-endian方法(big-endian方法也叫做網(wǎng)絡(luò)編碼)。對(duì)于人來(lái)說(shuō)我們的語(yǔ)言都是從左到右的習(xí)慣方式。這看上去似乎被認(rèn)為是自然的存儲(chǔ)字符和數(shù)字方式-你同樣也希望以同樣的方式出現(xiàn)在你面前。許多人因此也會(huì)認(rèn)為big-endian是流行的存儲(chǔ)方式,正如我們平時(shí)所讀到的。

    然而,Intel處理器(CPUs)和DEC Alphas和至少一些在他們的平臺(tái)的其他程序都是little-endian的。對(duì)于little-endian有一個(gè)問(wèn)題,那就是如果你增加數(shù)字的值,你可能在左邊增加數(shù)字(高位非指數(shù)函數(shù)需要更多的數(shù)字)。因此,經(jīng)常需要增加兩位數(shù)字并移動(dòng)存儲(chǔ)器里所有Big-endian順序的數(shù)字,把所有數(shù)向右移,這會(huì)增加計(jì)算機(jī)的工作量。不過(guò),使用little-endian的存儲(chǔ)器中不重要的字節(jié)可以存在它原來(lái)的位置,新的數(shù)可以存在它的右邊的高位地址里。這就意味著計(jì)算機(jī)中的某些計(jì)算可以變得更加簡(jiǎn)單和快速。

    Feedback

    # 這個(gè)我研究過(guò)。  回復(fù)  更多評(píng)論   

    2006-11-08 08:43 by lvcha
    java因?yàn)榇嬖谔摂M機(jī),所以把底層的大端和小端問(wèn)題屏蔽了,內(nèi)部都是小端,恰恰與.net相反,它沒(méi)有屏蔽這件事情。
    呵呵,所以他們兩個(gè)序列化反序列化需要手工處理一下。java端。

    # re: 大端還是小端?  回復(fù)  更多評(píng)論   

    2006-11-10 10:36 by nemo
    對(duì)。Java等的語(yǔ)言編譯器必須明確他們開發(fā)的目標(biāo)代碼使用的是什么存儲(chǔ)方式。如果有必要,可以使用轉(zhuǎn)換器可以用來(lái)轉(zhuǎn)換存儲(chǔ)順序。

    # re: 大端還是小端?  回復(fù)  更多評(píng)論   

    2009-04-04 21:03 by Moto
    反了吧,Big Endian是高位存低址啊。

    # re: 大端還是小端?  回復(fù)  更多評(píng)論   

    2009-04-04 21:05 by Moto
    哦,沒(méi)反。有點(diǎn)暈

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    posts - 21, comments - 74, trackbacks - 0, articles - 3

    Copyright © nemo

    主站蜘蛛池模板: 日韩视频在线观看免费| 免费在线观看自拍性爱视频| 日韩精品内射视频免费观看| 国产精品亚洲产品一区二区三区| 男女猛烈xx00免费视频试看| 小小影视日本动漫观看免费| 337P日本欧洲亚洲大胆精品| 国产精品国产午夜免费福利看 | 亚洲精品成人片在线观看| 久久综合久久综合亚洲| 成人毛片免费观看视频在线| 亚洲国产成人手机在线观看| 国产嫩草影院精品免费网址| 曰批全过程免费视频免费看 | 国产真人无码作爱视频免费| 亚洲大尺度无码无码专区| 一级毛片成人免费看免费不卡| 精品日韩亚洲AV无码| 成人免费黄色网址| 亚洲一线产区二线产区区| 日本不卡视频免费| 国产黄色免费观看| 亚洲av永久无码精品国产精品| 69视频免费观看l| 精品亚洲成A人无码成A在线观看| 成年女人毛片免费播放人| 国产尤物在线视精品在亚洲| 亚洲精品成人网站在线观看| 999任你躁在线精品免费不卡| 亚洲卡一卡二卡乱码新区| 一级毛片直播亚洲| 日本黄色动图免费在线观看| 国产99在线|亚洲| 亚洲麻豆精品国偷自产在线91| 七色永久性tv网站免费看| 亚洲人成77777在线观看网| 亚洲精品和日本精品| 99爱视频99爱在线观看免费| 亚洲s码欧洲m码吹潮| 亚洲国产另类久久久精品小说 | 国产免费131美女视频|