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

Welcome to ErranLi's Blog!

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  106 Posts :: 1 Stories :: 97 Comments :: 0 Trackbacks

常用鏈接

留言簿(12)

搜索

  •  

積分與排名

  • 積分 - 177454
  • 排名 - 152

最新評論

閱讀排行榜

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

?Little Endian & Big Endian????

這個標題中的Endian是什么意思呢?還是讓我們先來看看下面的情況,這是內存中一個WORD值中的內容,那么這個WORD中的值是0x1234呢,還是0x3412???

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

熟悉x86匯編的人立刻就知道這個值應為0x3412,很對,但在一些情況下,比如說你在SGI的機器上看到這種情況,則正好相反,0x1234才是正確答案,這與CPU內部處理數據的方式有關。這兩種處理方式都存在于不同廠商生產的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.?

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

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

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;
}

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

當然如果在byte?ordering相同的情況下,應該不必用這個轉換函數,所以我們可以定義一個宏來處理不同的byte?ordering,也可以在運行時測試byte?ordering,?下面的代碼給出了一個簡單的測試方法。?


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

但是float比較怪,有可能所涉及到不僅僅是byte?order的問題,因為有些平臺如Alpha不使用IEEE的浮點格式,還得自己轉換。當然同上,其它的方法一是將所用的float用文本方式輸入輸出,另一個辦法是在某些情況下可將其轉換成定點數再處理,這里我不再深入。

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


//?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挺簡單的,一般應用中可能也用不上,但若您對寫跨平臺的程序有興趣,則一定要了解的比較清楚才行。以上代碼都是從實際使用的源碼中取下來的。?

附:常見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 閱讀(5339) 評論(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>
            亚洲一区二区三区四区视频| 日韩亚洲在线| 欧美va天堂在线| 亚洲精品免费网站| 一区二区三区四区五区在线| 亚洲一区二区三区在线播放| 99精品欧美一区二区三区| 久久久91精品国产一区二区精品| 欧美电影在线| 合欧美一区二区三区| 亚洲社区在线观看| 免费中文字幕日韩欧美| 裸体女人亚洲精品一区| 国产免费成人av| 一区二区三区欧美成人| 亚洲图片欧美一区| 欧美日本韩国一区| 亚洲国产精品一区制服丝袜| 亚洲视频一区二区在线观看| 亚洲一区二区三区乱码aⅴ| 欧美精品久久久久a| 91久久精品日日躁夜夜躁欧美| 欧美一区二区三区久久精品茉莉花| 亚洲黄色一区二区三区| 另类酷文…触手系列精品集v1小说| 国产欧美一区二区精品婷婷| 亚洲一区二区三区激情| 欧美一区二区成人| 国产亚洲日本欧美韩国| 久久久久久一区二区| 亚洲欧美日韩视频一区| 国产欧美日韩不卡| 91久久久精品| 好吊妞这里只有精品| 亚洲婷婷综合久久一本伊一区| 国产曰批免费观看久久久| 亚洲宅男天堂在线观看无病毒| 亚洲人成亚洲人成在线观看图片 | 欧美激情自拍| 久久裸体艺术| 国产欧美一区在线| 亚洲国内欧美| 欧美另类在线播放| 美女视频黄 久久| 久久躁狠狠躁夜夜爽| 亚洲欧美综合v| 欧美一区二区三区视频在线观看| 99视频精品在线| 在线亚洲+欧美+日本专区| 亚洲一区二区在线观看视频| 欧美成人一品| 久久久久久久网| 久久精彩免费视频| 亚洲国产精品999| 午夜免费在线观看精品视频| 国产一区二区在线观看免费播放| 日韩亚洲在线观看| 亚洲精品欧美精品| 亚洲制服av| 亚洲国产成人精品久久久国产成人一区| 一区二区三区色| 精品99一区二区| 亚洲欧洲一二三| 亚洲第一免费播放区| 亚洲伦理精品| 国产视频久久| 最近中文字幕日韩精品| 亚洲福利视频免费观看| 久久久亚洲精品一区二区三区| 欧美一乱一性一交一视频| 国产精品久久久久久亚洲调教| 久久精品国产91精品亚洲| 欧美va天堂| 久久成人精品电影| 久久精品日产第一区二区三区| 国产精品嫩草99a| 亚洲欧美一区二区三区久久| 日韩天堂av| 欧美精品久久99| 亚洲性夜色噜噜噜7777| 欧美承认网站| 欧美黑人一区二区三区| 亚洲精选久久| 亚洲视频国产视频| 亚洲欧美精品在线| 牛牛影视久久网| 欧美一区二区三区另类| 国产日本精品| 久久综合色天天久久综合图片| 免费欧美网站| 99这里只有久久精品视频| 欧美日韩高清不卡| 欧美电影免费| 极品尤物av久久免费看| 欧美电影打屁股sp| 亚洲一区在线直播| 久久综合九色综合欧美就去吻 | 欧美日韩国产成人在线观看| 夜夜嗨一区二区三区| 久久国产精品一区二区| 亚洲国产天堂久久综合网| 欧美日韩亚洲视频| 欧美成人高清| 亚洲一品av免费观看| 国产亚洲欧美一区二区| 欧美黄免费看| 亚洲日本激情| 午夜精品福利一区二区蜜股av| 韩国精品一区二区三区| 欧美日韩国产一区二区三区| 欧美亚洲在线视频| 99视频精品在线| 久久免费视频网| 制服诱惑一区二区| 在线看无码的免费网站| 国产精品久久久久久久久久直播| 久久国产毛片| 亚洲影视九九影院在线观看| 亚洲第一网站免费视频| 亚洲裸体在线观看| 国产在线精品一区二区中文| 欧美三区美女| 亚洲一区欧美二区| 亚洲欧洲日韩综合二区| 久久字幕精品一区| 欧美亚洲日本网站| 狠狠色综合一区二区| 国产精品国产三级国产普通话99 | 久久精品99无色码中文字幕| 妖精成人www高清在线观看| 亚洲高清在线精品| 久久亚洲一区二区| 久久激情中文| 午夜在线精品偷拍| 99精品福利视频| 老司机精品视频一区二区三区| 欧美顶级艳妇交换群宴| 欧美在线一二三| 亚洲人成毛片在线播放| 男男成人高潮片免费网站| 久久婷婷久久一区二区三区| 欧美一区二区三区在线视频| 亚洲一级二级| 亚洲性图久久| 亚洲免费小视频| 亚洲欧美在线看| 亚洲欧美日韩综合一区| 午夜精品久久久久影视 | 伊人精品视频| 欧美日韩在线一区二区| 欧美日韩免费高清一区色橹橹| 欧美sm重口味系列视频在线观看| 久热精品在线视频| 欧美成ee人免费视频| 欧美精彩视频一区二区三区| 欧美精品播放| 国产精品家庭影院| 国产欧美精品在线播放| 国产欧美日韩中文字幕在线| 国产日韩在线一区| 永久久久久久| 亚洲精品乱码久久久久久蜜桃91 | 国产精品99久久不卡二区| 一区二区三区精品视频| 亚洲欧美精品在线| 噜噜噜躁狠狠躁狠狠精品视频 | 久久精品亚洲国产奇米99| 久久免费视频网| 亚洲人成亚洲人成在线观看图片| 夜色激情一区二区| 欧美亚洲三区| 牛牛影视久久网| 国产精品视频免费一区| 欧美日韩国内| 国产视频久久| 亚洲人体1000| 欧美亚洲一区在线| 欧美激情免费观看| 亚洲视频免费在线观看| 久久青草久久| 国产精品久久久久久久第一福利| 国产亚洲制服色| 99热这里只有成人精品国产| 欧美在线观看网站| 亚洲激情视频在线播放| 亚久久调教视频| 欧美日韩高清区| 国产亚洲午夜高清国产拍精品| 亚洲精品影视在线观看| 久久九九免费| 日韩视频在线你懂得| 久久久久五月天| 国产精品视频精品| 亚洲精品一区二区三区99| 久久精品视频在线| 在线一区二区三区四区| 欧美高清视频一区二区| 精品51国产黑色丝袜高跟鞋| 亚洲欧美国产高清va在线播| 亚洲风情在线资源站|