2014-01-05 68 views
0

我目前正在爲一個學校項目開發一個數據包嗅探器/分析器,並且無法從DNS標頭中提取DNS標誌。從uint16_t閱讀標誌

一個DNS頭看起來是這樣的: enter image description here

的DNS頭結構是這樣的:

struct dnshdr { 
     uint16_t xid; 
     uint16_t flags; 
     uint16_t qdcount; 
     uint16_t ancount; 
     uint16_t nscount;           
     uint16_t arcount; 
}; 

我怎樣才能從uint16_t提取單獨的標誌嗎?

回答

1

您可以定義一個位域結構,它總是在紙面上聽起來是最乾淨的方式,但實際上卻是實現定義的功能的噩夢,幾乎完全不可移植,或者用面具和輪班的簡單方式來做 - 宏是通用的實現:

#define QR(f)  (f & 0x0001) 
#define OPCODE(f) ((f & 0x001E) >> 1) 
#define AA(f)  ((f & 0x0020) >> 5) 
...etc 

當然這是假設任何必要的字節順序修正已經做了的(所以uint16_t的兩個字節是按照正確的順序來解釋這種方式)

有感:一位標誌並不是真的需要轉移 - 一旦他們被掩蓋,他們將是零或非零,這是足夠的測試他們在C

+0

這沒有伎倆感謝 –