小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【轉(zhuǎn)】網(wǎng)絡(luò)字節(jié)序與主機(jī)字節(jié)序 - 做最好的自己 - wellnp - 和訊博客

 darkhero 2007-05-25
網(wǎng)絡(luò)字節(jié)序與主機(jī)字節(jié)序
作者: ppnote 發(fā)表日期: 2006-06-19 22:45 文章屬性: 原創(chuàng) 復(fù)制鏈接


網(wǎng)絡(luò)字節(jié)序與主機(jī)字節(jié)序

不同的CPU有不同的字節(jié)序類型 這些字節(jié)序是指整數(shù)在內(nèi)存中保存的順序 這個(gè)叫做主機(jī)序
最常見的有兩種
1. Little endian:將低序字節(jié)存儲(chǔ)在起始地址
2. Big endian:將高序字節(jié)存儲(chǔ)在起始地址

LE little-endian
最符合人的思維的字節(jié)序
地址低位存儲(chǔ)值的低位
地址高位存儲(chǔ)值的高位
怎么講是最符合人的思維的字節(jié)序,是因?yàn)閺娜说牡谝挥^感來(lái)說(shuō)
低位值小,就應(yīng)該放在內(nèi)存地址小的地方,也即內(nèi)存地址低位
反之,高位值就應(yīng)該放在內(nèi)存地址大的地方,也即內(nèi)存地址高位

BE big-endian
最直觀的字節(jié)序
地址低位存儲(chǔ)值的高位
地址高位存儲(chǔ)值的低位
為什么說(shuō)直觀,不要考慮對(duì)應(yīng)關(guān)系
只需要把內(nèi)存地址從左到右按照由低到高的順序?qū)懗?
把值按照通常的高位到低位的順序?qū)懗?
兩者對(duì)照,一個(gè)字節(jié)一個(gè)字節(jié)的填充進(jìn)去

例子:在內(nèi)存中雙字0x01020304(DWORD)的存儲(chǔ)方式

內(nèi)存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04

例子:如果我們將0x1234abcd寫入到以0x0000開始的內(nèi)存中,則結(jié)果為
      big-endian   little-endian
0x0000   0x12       0xcd
0x0001   0x23       0xab
0x0002   0xab       0x34
0x0003   0xcd       0x12
x86系列CPU都是little-endian的字節(jié)序.

網(wǎng)絡(luò)字節(jié)順序是TCP/IP中規(guī)定好的一種數(shù)據(jù)表示格式,它與具體的CPU類型、操作系統(tǒng)等無(wú)關(guān),從而可以保證數(shù)據(jù)在不同主機(jī)之間傳輸時(shí)能夠被正確解釋。網(wǎng)絡(luò)字節(jié)順序采用big endian排序方式。

為了進(jìn)行轉(zhuǎn)換 bsd socket提供了轉(zhuǎn)換的函數(shù) 有下面四個(gè)
htons 把unsigned short類型從主機(jī)序轉(zhuǎn)換到網(wǎng)絡(luò)序
htonl 把unsigned long類型從主機(jī)序轉(zhuǎn)換到網(wǎng)絡(luò)序
ntohs 把unsigned short類型從網(wǎng)絡(luò)序轉(zhuǎn)換到主機(jī)序
ntohl 把unsigned long類型從網(wǎng)絡(luò)序轉(zhuǎn)換到主機(jī)序

在使用little endian的系統(tǒng)中 這些函數(shù)會(huì)把字節(jié)序進(jìn)行轉(zhuǎn)換
在使用big endian類型的系統(tǒng)中 這些函數(shù)會(huì)定義成空宏

同樣 在網(wǎng)絡(luò)程序開發(fā)時(shí) 或是跨平臺(tái)開發(fā)時(shí) 也應(yīng)該注意保證只用一種字節(jié)序 不然兩方的解釋不一樣就會(huì)產(chǎn)生bug.

注:
1、網(wǎng)絡(luò)與主機(jī)字節(jié)轉(zhuǎn)換函數(shù):htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上運(yùn)行不同的操作系統(tǒng),字節(jié)序也是不同的,參見下表。
處理器     操作系統(tǒng)     字節(jié)排序
Alpha     全部     Little endian
HP-PA     NT     Little endian
HP-PA     UNIX     Big endian
Intelx86     全部     Little endian <-----x86系統(tǒng)是小端字節(jié)序系統(tǒng)
Motorola680x()     全部     Big endian
MIPS     NT     Little endian
MIPS     UNIX     Big endian
PowerPC     NT     Little endian
PowerPC     非NT     Big endian   <-----PPC系統(tǒng)是大端字節(jié)序系統(tǒng)
RS/6000     UNIX     Big endian
SPARC     UNIX     Big endian
IXP1200 ARM核心     全部     Little endian

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多