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