日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)

發布時間:2023/12/13 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 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)和长度转换为整形)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。