|
大端(Big-Endian),小端(Little-Endian)以及網(wǎng)絡(luò)字節(jié)序的概念在編程中經(jīng)常會(huì)遇到,網(wǎng)絡(luò)字節(jié)序(Network Byte Order)一般是指大端(Big-Endian,對(duì)大部分網(wǎng)絡(luò)傳輸協(xié)議而言)傳輸,大端小端的概念是面向多字節(jié)數(shù)據(jù)類型的存儲(chǔ)方式定義的,小端就是低位在前(低位字節(jié)存在內(nèi)存低地址,字節(jié)高低順序和內(nèi)存高低地址順序相同),大端就是高位在前,(其中“前”是指靠近內(nèi)存低地址,存儲(chǔ)在硬盤上就是先寫那個(gè)字節(jié))。概念上字節(jié)序也叫主機(jī)序。 一、大小端概念 1、首先大小端是面向多字節(jié)類型定義的,比如2字節(jié)、4字節(jié)、8字節(jié)整型、長(zhǎng)整型、浮點(diǎn)型等,單字節(jié)的字符串一般不用考慮。 2、大端小端存儲(chǔ)、傳輸、以及接收處理需要對(duì)應(yīng)。 3、大端(Big-Endian)就是高字節(jié)(MSB)在前,內(nèi)存存儲(chǔ)體現(xiàn)上,數(shù)據(jù)的高位更加靠近低地址。(低地址存高字節(jié)) 4、小端(Little-Endian)就是低字節(jié)(LSB)在前,內(nèi)存存儲(chǔ)體現(xiàn)上,數(shù)據(jù)的低位更加靠近低地址。(低地址存低字節(jié)) 5、網(wǎng)絡(luò)字節(jié)序一般是指大端傳輸。 二、大小端存儲(chǔ)示例 假設(shè)一個(gè)32位 unsigned int型數(shù)據(jù)0x12 34 56 78,大小端8位存儲(chǔ)方式如下: 大端存儲(chǔ)方式為0x12 34 56 78 小端存儲(chǔ)方式為0x78 56 34 12,如下圖。 201205100033472415.jpg 三、常見(jiàn)CPU的大小端存儲(chǔ)方式 不同CPU有不同的字節(jié)序類型,典型的使用小端存儲(chǔ)的CPU有:Intel x86和ARM 典型的使用大端存儲(chǔ)CPU有:Power PC、MIPS UNIX和HP-PA UNIX 注: 以上CPU需根據(jù)具體型號(hào)查詢手冊(cè),有的CPU甚至可能同時(shí)能支持兩種存儲(chǔ)方式。 上文說(shuō)的網(wǎng)絡(luò)字節(jié)順序則是表示網(wǎng)絡(luò)傳輸時(shí)的字節(jié)序,按照TCP/IP協(xié)議是按照大端傳輸方式,也就是高字節(jié)先走(先傳12,接著34,56,78),這跟本機(jī)存儲(chǔ)和服務(wù)器存儲(chǔ)沒(méi)有關(guān)系,只要確保雙方解析對(duì)應(yīng)即可。 四、四個(gè)轉(zhuǎn)換函數(shù) C/C++中有如下四個(gè)常用的轉(zhuǎn)換函數(shù),這四個(gè)函數(shù)在小端系統(tǒng)中生效,大端系統(tǒng)由于和網(wǎng)絡(luò)字節(jié)序相同,所以無(wú)需轉(zhuǎn)換。 htons —— 把unsigned short類型從主機(jī)序轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)序 ntohs —— 把unsigned short類型從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)成主機(jī)序 htonl —— 把unsigned long類型從主機(jī)序轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)序 ntohl —— 把unsigned long類型從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)成主機(jī)序 以上函數(shù)包含頭文件: #if defined(_LINUX) || defined(_DARWIN) #include #endif #ifdef WIN32 #include #endif 相關(guān)資源:...大端法小端法,網(wǎng)絡(luò)字節(jié)序是大端還是小端-其它代碼類資源-CSDN... |
|
|
來(lái)自: cslwp > 《字節(jié)序》