記憶體中的多位元組資料相對於記憶體位址有大端和小段之分,磁碟檔案中的多位元組資料相對於檔案中的偏移位址也有大端和小端之分,網路資料流同樣有大端小端之分,那麼如何定義網路資料流的位址呢?傳送主機通常將傳送快取區中的資料按記憶體位址從低到高的順序發出,接收主機把從網路上接到的位元組依次儲存在接受緩衝區中,也是按記憶體位址從低到高的順序儲存,因此,網路資料流的位址應這樣規定:先發出的資料是低位址,後發出的資料是高位址。
tcp/ip協議規定:網路資料流應採用大端位元組序。即低位址高位元組。比如,位址0-1是16位的源埠號,如果這個埠號是1000(0x3e8),則位址0是0x03,位址1是0xe8,也就是先發0x03,再發0xe8,這16位在傳送主機的緩衝區也應該是低位址存0x03,高位址存0xe8。但是,如果傳送主機是小端位元組序的,這16位被解釋成0xe803,而不是1000.因此,傳送主機把1000填到傳送緩衝區之前需要做位元組序的轉換。同樣地,接收主機如果是小端位元組序的,接到16位的源埠號也要做位元組序的轉換。如果主機是大端位元組序的,傳送和接收都不需要做轉換。同理,32位的ip位址也要考慮網路位元組序和主機位元組序的問題。
網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的
cpu 型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用大端排序方式。
為使網路程式具有可移植性,使同樣的c**在大端和小端計算機上編譯後都能正常執行,可以呼叫一下庫函式做網路位元組序和主機位元組序的轉換。
#includeuint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h表示host,n表示network,l表示32位長整數,s表示16位短整數。
如果主機是小端位元組序,這些函式將引數做相應的大小端轉換然後返回,如果主機是大端位元組序,這些函式不做轉換,將引數原封不動地返回。
對於作業系統不同,網路位元組序也是不同的:
處理器 作業系統 位元組排序
alpha 全部 little endian
hp-pa nt little endian
hp-pa unix big endian
intelx86 全部 little endian
大小端:
大端模式:
是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。
小端模式:
是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。
大小端以及主位元組序和網路位元組序問題
大小端問題與主位元組序及網路位元組序 一般在x86和arm下為小端模式 1 2 例如 0x0000 0x12 0x0001 0x34 0x0002 0xab 0x0003 0xcd 大端模式讀取為 1234abcd 小端模式讀取資料為 cdab3412.而網路位元組序這是tcp ip協議中定義好的一...
大小端 網路位元組序 本地位元組序問題
總結 1 80x86使用小端法 即本地位元組序 網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳...
大小端 網路位元組序問題
總結 1 80x86使用小端法,網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳送的buffer...