青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Welcome to ErranLi's Blog!

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  106 Posts :: 1 Stories :: 97 Comments :: 0 Trackbacks

常用鏈接

留言簿(12)

搜索

  •  

積分與排名

  • 積分 - 178126
  • 排名 - 152

最新評(píng)論

閱讀排行榜

原文:http://dev.csdn.net/article/39/39864.shtm

?Little Endian & Big Endian????

這個(gè)標(biāo)題中的Endian是什么意思呢?還是讓我們先來(lái)看看下面的情況,這是內(nèi)存中一個(gè)WORD值中的內(nèi)容,那么這個(gè)WORD中的值是0x1234呢,還是0x3412???

low?byte?high?byte?
0x12????? 0x34?

熟悉x86匯編的人立刻就知道這個(gè)值應(yīng)為0x3412,很對(duì),但在一些情況下,比如說(shuō)你在SGI的機(jī)器上看到這種情況,則正好相反,0x1234才是正確答案,這與CPU內(nèi)部處理數(shù)據(jù)的方式有關(guān)。這兩種處理方式都存在于不同廠商生產(chǎn)的CPU之中,在上例中若此WORD值為0x3412的,我們稱之為little-endian,?若為0x1234的,我們稱之為big-endian,這是兩種不同的byte?orders。MSDN中有比較精確的定義如下:

Byte?Ordering?Byte?ordering?Meaning?
big-endian?The?most?significant?byte?is?on?the?left?end?of?a?word.?
little-endian?The?most?significant?byte?is?on?the?right?end?of?a?word.?

一般來(lái)說(shuō)我們不用關(guān)心byte?ordering的問(wèn)題,但若要涉及跨平臺(tái)之間的通信和資源共享,則不得不考慮這個(gè)問(wèn)題了。也許你會(huì)說(shuō),我永遠(yuǎn)不會(huì)去用其它非x86的CPU,也許是這樣,你甚至可以不必知道我們最常用的Intel,AMD等生產(chǎn)的x86的byte?ordering是little-endian的,而且按現(xiàn)在的裝機(jī)數(shù)量來(lái)看,可以說(shuō)世界上絕大多數(shù)CPU是little-endian的,但多了解一些沒(méi)有什么壞處,也許有用上的一天,實(shí)際若您要涉及到網(wǎng)絡(luò)編程,了解一些還是有所幫助的,看完本文后您就應(yīng)該知道為何socket編程中為何要用到如?ntohl,?htonl,?ntohs,?htons這幾個(gè)看起來(lái)名字似乎怪怪的API了,也很容易理解這些函數(shù)名的意義了。

假設(shè)我們要在不同byte?ordering的機(jī)器之間傳輸和交換數(shù)據(jù),那該怎么辦呢,有兩個(gè)方法,一是全部轉(zhuǎn)換成文本來(lái)傳輸(如XML使用的),另一個(gè)方法兩方都按照某一方的byte?order,這時(shí)就涉及到了不同byte?order之間相互轉(zhuǎn)換的問(wèn)題(網(wǎng)絡(luò)傳輸標(biāo)準(zhǔn)如TCP/IP采用第二種方法并且由于歷史的原因,byte?ordering是big-endian的)。兩種之間該如何轉(zhuǎn)換呢?方法有很多,我們可以先看看MFC中在處理serialize的代碼中所用的方法(List),?雖然代碼應(yīng)該是高效易讀的,?但我個(gè)人并不喜歡它,?原因是我覺(jué)得這不是一種通用優(yōu)美的方法.下面列出的是我自己寫的轉(zhuǎn)換的代碼:

template
F3D_INLINE?T ConvertEndian(T??t)
{?
???T tResult?=?0;?
???for?(int??I?=?0;?I?<?sizeof(T);?++?I)?
???{?
??????tResult?<<=?8;????
??????tResult?|=?(t?&?0xFF)?;?

??????t?>>=?8;?
???}?
???return??tResult;
}

原理非常簡(jiǎn)單,交換字節(jié)順序,我就不多說(shuō)了,當(dāng)然這個(gè)寫法并不是快速的,?只是通用的(我沒(méi)條件試,?若有不對(duì)之處請(qǐng)指出),?若要快速的代碼,可以在不同platform上用與platform相關(guān)的代碼,?如在PowerPC上有?"load?word?byte-reversed?indexed"?(lwbrx)?和?"load?halfword?byte-reversed?indexed"?(lhbrx)?指令,?在x86上還可用BSWAP單個(gè)匯編指令等,在類型上專為int16,?int32寫的通用的代碼也可以比這快得多.?

當(dāng)然如果在byte?ordering相同的情況下,應(yīng)該不必用這個(gè)轉(zhuǎn)換函數(shù),所以我們可以定義一個(gè)宏來(lái)處理不同的byte?ordering,也可以在運(yùn)行時(shí)測(cè)試byte?ordering,?下面的代碼給出了一個(gè)簡(jiǎn)單的測(cè)試方法。?


//?Test?for?endianness.
F3D_INLINE?bool IsLittleEndian(void)
{?
???DWORD dwTestValue?=?0x12345678L;?
???return??(*((BYTE*)&dwTestValue)?==?0x78);
}

但是float比較怪,有可能所涉及到不僅僅是byte?order的問(wèn)題,因?yàn)橛行┢脚_(tái)如Alpha不使用IEEE的浮點(diǎn)格式,還得自己轉(zhuǎn)換。當(dāng)然同上,其它的方法一是將所用的float用文本方式輸入輸出,另一個(gè)辦法是在某些情況下可將其轉(zhuǎn)換成定點(diǎn)數(shù)再處理,這里我不再深入。

如果是讀寫第三方已經(jīng)指定byte?order的文件或數(shù)據(jù)流,比如說(shuō)讀SGI的位圖文件格式,則可以直接自行按指定的byte?order拼起來(lái),不必考慮host機(jī)是何種byte?ordering。下面我給出相應(yīng)的代碼:


//?Read?a?little-endian?TYPE?from?address
template
F3D_INLINE?T GetLittleEndian(const?BYTE*??pBuf)
{?
???T tResult?=?0;?
???pBuf?+=?sizeof(T)?-?1;?
???for?(int??I?=?0;?I?<?sizeof(T);?++?I)?
???{?
??????tResult?<<=?8;?
??????tResult?|=?*pBuf?--;?
???}?

???return??tResult;
}

//?Read?a?big-endian?TYPE?from?address
template
F3D_INLINE?T GetBigEndian(const?BYTE*??pBuf)
{?
???T tResult?=?0;?
???for?(int??I?=?0;?I?<?sizeof(T);?++?I)?
???{?
??????tResult?<<=?8;?
??????tResult?|=?*pBuf?++;?
???}?

???return??tResult;
}

//?Set?a?little-endian?TYPE?on?a?address
template
F3D_INLINE?void SetLittleEndian(BYTE*??pBuf,?T??t)
{?
???for?(int??I?=?0;?I?<?sizeof(T);?++?I)?
???{?
???*pBuf?++?=?BYTE(t?&?0xFF);?
???t?>>=?8;?
???}
}

//?Set?a?big-endian?T?on?a?address
template
F3D_INLINE?void SetBigEndian(BYTE*??pBuf,?T??t)
{?
???pBuf?+=?sizeof(T)?-?1;?
???for?(int??I?=?0;?I?<?sizeof(T);?++?I)?
???{?
??????*pBuf?--?=?BYTE(t?&?0xFF);?
??????t?>>=?8;?
???}
}

從上文可以看出,byte?order挺簡(jiǎn)單的,一般應(yīng)用中可能也用不上,但若您對(duì)寫跨平臺(tái)的程序有興趣,則一定要了解的比較清楚才行。以上代碼都是從實(shí)際使用的源碼中取下來(lái)的。?

附:常見(jiàn)Processor,?OS的byte?ordering情況

Processor?OS?Order?
x86?(Intel,?AMD,?…?)?All?little-endian?
DEC?Alpha?All?little-endian?
HP-PA?NT?little-endian?
HP-PA?UNIX?big-endian?
SUN?SPARC?All??big-endian?
MIPS?NT?little-endian?
MIPS?UNIX?big-endian?
PowerPC?NT?little-endian?
PowerPC?non-NT?big-endian?
RS/6000?UNIX?big-endian?
Motorola?m68k?All?big-endian?

posted on 2007-10-13 16:23 erran 閱讀(5346) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C & C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲韩国一区二区三区| 亚洲国产精品久久| 欧美日韩精品免费观看| 国产欧美日韩亚洲一区二区三区| 亚洲欧洲日韩女同| 欧美成年人网| 欧美亚洲午夜视频在线观看| 国产精品xxx在线观看www| 亚洲精品视频免费| 免费观看久久久4p| 久久久久久久久久久久久女国产乱 | 国产一区香蕉久久| 欧美一级久久| 亚洲欧美日韩在线综合| 国产精品久久久久秋霞鲁丝 | 在线观看av不卡| 久久夜色精品一区| 久久久亚洲国产天美传媒修理工| 国产欧美日韩三区| 久久精品免费播放| 久久国产99| 国内精品一区二区| 免播放器亚洲一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲激情一区二区| 亚洲看片一区| 国产精品久久久久久一区二区三区| 亚洲一区二区三区四区中文| 中文精品视频| 激情综合网址| 亚洲第一色在线| 欧美日韩一区精品| 久久不见久久见免费视频1| 久久久www成人免费毛片麻豆| 亚洲高清三级视频| 日韩午夜电影av| 国产欧美精品一区aⅴ影院| 久久一二三区| 欧美久色视频| 欧美在线中文字幕| 久久亚洲综合色| 国产精品99久久久久久久女警 | 欧美中文字幕不卡| 亚洲三级性片| 亚洲欧美日韩国产一区二区三区 | 女仆av观看一区| 欧美精品xxxxbbbb| 亚洲欧美中文另类| 久久久亚洲精品一区二区三区 | 午夜在线视频观看日韩17c| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美/亚洲一区| 亚洲影院免费| 久久综合999| 亚洲综合三区| 欧美成人午夜激情在线| 午夜精品久久久久久久男人的天堂| 久久午夜电影网| 亚洲网站在线| 欧美大片国产精品| 久久手机免费观看| 美女亚洲精品| 国产精品久久久久秋霞鲁丝 | 在线中文字幕一区| 亚洲国产人成综合网站| 亚洲欧美日韩一区二区三区在线观看| 亚洲高清自拍| 欧美一区1区三区3区公司| 9色porny自拍视频一区二区| 欧美制服第一页| 欧美亚洲三区| 国产精品成人在线| 亚洲靠逼com| 日韩视频专区| 男人天堂欧美日韩| 老司机精品视频一区二区三区| 欧美日韩国产在线播放| 欧美激情第一页xxx| 国产一区二区三区不卡在线观看| 9久草视频在线视频精品| 亚洲精品一区二区三区福利| 久久深夜福利免费观看| 久久久噜噜噜久久| 国产亚洲一本大道中文在线| 中国成人在线视频| 亚洲图片激情小说| 欧美久久久久免费| 日韩一级免费| 亚洲一区二区三区精品在线观看| 欧美日韩xxxxx| 亚洲九九爱视频| 久久久久久久网站| 老司机免费视频久久| 国内激情久久| 久久精品国产亚洲5555| 久久噜噜噜精品国产亚洲综合| 国产欧美在线视频| 欧美中文日韩| 欧美91福利在线观看| 亚洲高清久久网| 欧美刺激性大交免费视频| 欧美大色视频| 最新国产乱人伦偷精品免费网站| 欧美www在线| 日韩视频一区二区三区在线播放| 亚洲精品久久在线| 欧美日韩亚洲一区二区三区四区| 一区二区三区精品视频在线观看| 亚洲色无码播放| 国产精品视频一区二区高潮| 亚洲网站在线观看| 久久美女艺术照精彩视频福利播放| 国产专区欧美专区| 免费观看国产成人| 亚洲日本va午夜在线电影| 中日韩高清电影网| 欧美有码在线视频| 欧美激情亚洲精品| 日韩午夜一区| 欧美中文字幕在线观看| 国产综合色在线视频区| 久久久久久自在自线| 亚洲人成网站777色婷婷| 99日韩精品| 国产精品你懂的在线欣赏| 久久精品日韩| 一区二区激情小说| 美女精品国产| 欧美精品久久一区| 亚洲欧美在线aaa| 欧美福利视频网站| 亚洲欧美色一区| 亚洲国产va精品久久久不卡综合| 欧美啪啪一区| 久久久久久久97| 亚洲婷婷国产精品电影人久久| 毛片av中文字幕一区二区| 亚洲网站啪啪| 极品少妇一区二区三区精品视频| 欧美精品免费在线| 久久本道综合色狠狠五月| 亚洲精品国产视频| 久久在线91| 亚洲与欧洲av电影| 亚洲国产精品黑人久久久| 国产欧美1区2区3区| 欧美欧美午夜aⅴ在线观看| 久久久久久999| 亚洲男女毛片无遮挡| 亚洲精品黄色| 免费中文字幕日韩欧美| 欧美一区二区视频网站| 一区二区三区欧美在线| 亚洲国产日韩一级| 黄色成人精品网站| 国产麻豆91精品| 欧美午夜精品久久久久免费视| 另类春色校园亚洲| 欧美在线免费播放| 亚洲综合好骚| 9久草视频在线视频精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美伊人久久| 宅男噜噜噜66一区二区66| 精品成人在线视频| 国产在线精品成人一区二区三区| 欧美日韩另类综合| 欧美区在线观看| 欧美久久电影| 欧美aa在线视频| 麻豆国产精品777777在线| 久久成人羞羞网站| 欧美一区高清| 欧美一区二区视频在线观看| 亚洲视频综合在线| 亚洲影视九九影院在线观看| 99热在这里有精品免费| 亚洲精品免费在线观看| 亚洲精品国产精品国自产在线| 亚洲区免费影片| 亚洲精品视频免费观看| 99伊人成综合| 一区二区三区欧美视频| 亚洲深夜福利在线| 亚洲尤物视频网| 欧美在线观看视频| 欧美一区二区三区另类 | 亚洲国产欧美一区二区三区丁香婷| 国产亚洲欧美aaaa| 国内精品久久久久影院薰衣草| 国内精品久久久久影院色 | 亚洲片在线观看| 亚洲人成高清| 一区二区三区福利| 亚洲欧美在线aaa| 久久精品人人爽| 蜜桃久久av| 9l国产精品久久久久麻豆| 亚洲免费在线观看视频| 久久久久99精品国产片|