2013-07-12 61 views
0

我不是貿易的C開發人員......真相被告知我不是貿易開發人員,所以我使用的術語可能不正確。混合'*'和' - >'語法混淆的指針參考

我已經花了最後一個小時左右的時間閱讀了關於define的陳述,然後關於pointer的引用,並且對以下實例頗感困惑。

鑑於:

#define get_u_int16_t (X,O) (*(u_int16_t *)(((u_int8_t *)X) + O)) 

if (get_u_int16_t(packet->payload, 0) == htons(0x0004)) { 
//do something 
return; 
} 

這是否意味着get_u_int16_t(packet->payload, 0)分割由packet->payload指針稱爲成8個比特段中的數據,並返回第一個8位(由於+ 0)?

這是我試圖預留的一部分nDPI庫的例子,afp.c

[注]

htons()是一個函數,它在主機字節順序取word(16位)(在大多數機器小端,或大端上大端機),它在網絡轉換爲word字節順序(總是大端)。在這種情況下,在packet->payload(謝謝AndreyT!)的偏移量0處將返回word大端,因此ntop開發人員決定使用htons()來轉換給定的值(在這種情況下是確定if一個流程是蘋果文件協議),對於網絡堆棧的大端來說是很少的端點。

[更多]

我搬到some questions to a forum that is more conducive to fuzzy questions to have some technicalities understood可能證明對人處理今後類似情況下非常有用。

回答

2

你是對的,但不是完全的。

u_int8_t類型用作尋址單元。它基本上是一個「字節」。所以

((u_int8_t *)X) + O) 

部分簡單地選擇位置的字節偏移量從由X指向的存儲器塊的開始O。這就是u_int8_t類型的角色結束的地方。

然後*(u_int16_t *)部分將該存儲位置解釋爲無符號的16位字。

因此,除了宏「返回」存儲在地址X + O上的16位值(不是8位值)之外,您得到了正確的結果。在您的具體示例中,宏用於讀取存儲塊packet->payload最開始(偏移量0)處存儲的無符號16位值。在給定的存儲塊

注意,寫入該方式的宏計算結果爲左值,這意味着它也可用於寫入在特定 16位數據的字節偏移量,例如

get_u_int16_t(packet->payload, 0) = 42; 

會寫42到駐留在內存塊packet->payload之初的16位字。

+0

優秀,容易理解的答案!非常感謝! – mbrownnyc