ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)
我們知道在由于大端機和小端機導致網(wǎng)絡字節(jié)序和主機序有可能是有差異的,我們可以使用系統(tǒng)的ntohs,ntohl,htons和htonl這些處理函數(shù)進行轉(zhuǎn)換,下面是我寫的一個關于ntohs在處理小端機字節(jié)序轉(zhuǎn)換的函數(shù)的簡單實現(xiàn).
思想大致如下:
用u_int16_t的2字節(jié)16位的整形變量來存儲這個整數(shù),首先將第一個字節(jié)和該變量進行或運算,運算結果左移八位,于是剛才的第一個字節(jié)結果就到了高八位,然后在與第二個字節(jié)進行或運算盡可以了
代碼如下:
u_int16_t convert16(u_char *p)
{
u_int16_t tmp = 0;
tmp |= p[0];
tmp <<= 8;
tmp |= p[1];
return tmp;
}
這樣就可以了。
由于是為了獲取DNS頭部中的資源數(shù)和附加數(shù)據(jù)中的數(shù)據(jù)長度部分而遇到的這個問題順便簡單介紹一下DNS的一些知識:
DNS報文的首部格式如下:
0 15 16 31
|
標識ID |
標志 |
|
問題數(shù) |
資源記錄數(shù) |
|
授權資源記錄數(shù) |
額外資源記錄數(shù) |
|
查詢問題 |
|
|
回答 |
|
|
授權信息 |
|
|
額外信息 |
|
如上圖的NDS報文,正事由于資源記錄數(shù)和額外資源記錄數(shù)是用兩字節(jié)的16進制表示,才會有我所說的問題,希望對大家有幫助!
下面這個是可以針對三字節(jié)表示長度的一個網(wǎng)絡序和主機節(jié)序的轉(zhuǎn)換,比如計算三字節(jié)表示數(shù)據(jù)長度的網(wǎng)絡字節(jié)序時,不過還是要用系統(tǒng)的函數(shù)轉(zhuǎn)換好,這里用到了太多乘法,效率會很低。
int hex2int(uint8_t u8_hex[])
{
int len = 0;
len = u8_hex[0]*16*16*16*16 + u8_hex[1]*16*16 + u8_hex[2];
return len;
}
我是一塊磚,哪里需要往哪搬。
總結
以上是生活随笔為你收集整理的ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BCC校验(异或和校验)
- 下一篇: css实现强制不换行/自动换行/强制换行