字节排序函数
大端字節(jié)序和小端字節(jié)序:
將低序字節(jié)存儲在起始地址(即低地址),這稱為小端字節(jié)序,將高序字節(jié)存儲在起始地址,這稱為大端字節(jié)序。
由于網(wǎng)絡(luò)協(xié)議必須指定一個網(wǎng)絡(luò)字節(jié)序,作為網(wǎng)絡(luò)編程人員,必須清楚各種字節(jié)序間的區(qū)別。例如,在一個TCP分節(jié)中,有一個16位的端口號和一個32位的IPv4地址,發(fā)送協(xié)議棧和接收協(xié)議棧必須對此多字節(jié)字段的傳送字節(jié)序進行協(xié)調(diào),以達成一致。網(wǎng)際協(xié)議在處理這些多字節(jié)整數(shù)時,使用大端字節(jié)序。
從理論上說,具體實現(xiàn)可以把多字節(jié)整數(shù)按主機字節(jié)序存儲在套接口地址結(jié)構(gòu)中,當(dāng)需要寫到協(xié)議頭部或從協(xié)議頭部取出時,再轉(zhuǎn)換到字節(jié)序格式或轉(zhuǎn)換回來,這樣可以避免我們牽涉細節(jié)。但是,由于歷史上的原因和POSIX規(guī)范的規(guī)定,套接口地址結(jié)構(gòu)中的某些成員按網(wǎng)絡(luò)字節(jié)序進行維護。這樣就必需考慮主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序間的相互轉(zhuǎn)換。這兩種字節(jié)序之間的轉(zhuǎn)換使用下列四個函數(shù):
#include<netinet/in.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
h代表host,n代表network,s代表16位值,l代表32位值。
當(dāng)使用這些函數(shù)時,我們不關(guān)心主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序的真實值。我們所做的只是調(diào)用適當(dāng)?shù)暮瘮?shù)來對給定值進行主機字節(jié)序與網(wǎng)絡(luò)字節(jié)序間的轉(zhuǎn)換。在那些與網(wǎng)際協(xié)議有相同字節(jié)序的系統(tǒng)中,這四個函數(shù)通常被定義為空宏。
轉(zhuǎn)載于:https://www.cnblogs.com/ChangeIt/archive/2011/12/26/2302588.html
總結(jié)
- 上一篇: 隐式事务(转)
- 下一篇: js中的preventDefault