| 網(wǎng)絡(luò )字節序與主機字節序 作者: ppnote 發(fā)表日期: 2006-06-19 22:45 文章屬性: 原創(chuàng ) 復制鏈接 |
| 網(wǎng)絡(luò )字節序與主機字節序 不同的CPU有不同的字節序類(lèi)型 這些字節序是指整數在內存中保存的順序 這個(gè)叫做主機序 最常見(jiàn)的有兩種 1. Little endian:將低序字節存儲在起始地址 2. Big endian:將高序字節存儲在起始地址 LE little-endian 最符合人的思維的字節序 地址低位存儲值的低位 地址高位存儲值的高位 怎么講是最符合人的思維的字節序,是因為從人的第一觀(guān)感來(lái)說(shuō) 低位值小,就應該放在內存地址小的地方,也即內存地址低位 反之,高位值就應該放在內存地址大的地方,也即內存地址高位 BE big-endian 最直觀(guān)的字節序 地址低位存儲值的高位 地址高位存儲值的低位 為什么說(shuō)直觀(guān),不要考慮對應關(guān)系 只需要把內存地址從左到右按照由低到高的順序寫(xiě)出 把值按照通常的高位到低位的順序寫(xiě)出 兩者對照,一個(gè)字節一個(gè)字節的填充進(jìn)去 例子:在內存中雙字0x01020304(DWORD)的存儲方式 內存地址 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04 例子:如果我們將0x1234abcd寫(xiě)入到以0x0000開(kāi)始的內存中,則結果為 big-endian little-endian 0x0000 0x12 0xcd 0x0001 0x23 0xab 0x0002 0xab 0x34 0x0003 0xcd 0x12 x86系列CPU都是little-endian的字節序. 網(wǎng)絡(luò )字節順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類(lèi)型、操作系統等無(wú)關(guān),從而可以保證數據在不同主機之間傳輸時(shí)能夠被正確解釋。網(wǎng)絡(luò )字節順序采用big endian排序方式。 為了進(jìn)行轉換 bsd socket提供了轉換的函數 有下面四個(gè) htons 把unsigned short類(lèi)型從主機序轉換到網(wǎng)絡(luò )序 htonl 把unsigned long類(lèi)型從主機序轉換到網(wǎng)絡(luò )序 ntohs 把unsigned short類(lèi)型從網(wǎng)絡(luò )序轉換到主機序 ntohl 把unsigned long類(lèi)型從網(wǎng)絡(luò )序轉換到主機序 在使用little endian的系統中 這些函數會(huì )把字節序進(jìn)行轉換 在使用big endian類(lèi)型的系統中 這些函數會(huì )定義成空宏 同樣 在網(wǎng)絡(luò )程序開(kāi)發(fā)時(shí) 或是跨平臺開(kāi)發(fā)時(shí) 也應該注意保證只用一種字節序 不然兩方的解釋不一樣就會(huì )產(chǎn)生bug. 注: 1、網(wǎng)絡(luò )與主機字節轉換函數:htons ntohs htonl ntohl (s 就是short l是long h是host n是network) 2、不同的CPU上運行不同的操作系統,字節序也是不同的,參見(jiàn)下表。 處理器 操作系統 字節排序 Alpha 全部 Little endian HP-PA NT Little endian HP-PA UNIX Big endian Intelx86 全部 Little endian <-----x86系統是小端字節序系統 Motorola680x() 全部 Big endian MIPS NT Little endian MIPS UNIX Big endian PowerPC NT Little endian PowerPC 非NT Big endian <-----PPC系統是大端字節序系統 RS/6000 UNIX Big endian SPARC UNIX Big endian IXP1200 ARM核心 全部 Little endian |
聯(lián)系客服