2011-10-28 18 views
0

從本質上講,我有兩個4字節的IP地址:匹配的目的地址,在C++中的轉發表項

u_int32_t daddr; // in the packet 
u_int32_t entry; // in the forwarding table 

我也有一個前綴與在轉發表項雲:

unsigned short prefix; // in forwarding table corresponding to entry 

我需要根據前綴將daddr匹配到條目。我很確定這意味着什麼:如果前綴是23,那麼我必須將條目的前23位與daddr匹配。我真的不知道從哪裏開始,因爲我不知道如何匹配個別位。

我有一個轉發表,其中有很多條目,每個條目都有不同的前綴。我不知道如何匹配達到正確的條目..任何幫助將不勝感激。 我的daddr存儲在我從netinet ip.h文件獲得的標準ip頭文件中。

編輯:我找到了「最長」的比賽。所以我沒有比較條目,只檢查它們是否相等,我比較它們以確定有多少位是相同的。當所有的位都相同時,最好的匹配是顯而易見的。

回答

2

只比較的a和一些未簽名的類型UIntb頂部n位:

const unsigned int NBITS = sizeof(UInt) * CHAR_BIT; 

UInt a, b; 

if ((a >> (NBITS - n)) == (b >> (NBITS - n))) { /*...*/ } 

比較底部m位:

if ((a << (NBITS - m)) == (b << (NBITS - m))) { /*...*/ } 

一些解釋:類型UIntsizeof(UInt)字節,因此也是NBITS位。要比較頂部的n位,我們只需將兩個數字向右移位,這樣只剩下n位(新的最高位用零填充,因爲類型是無符號的)。爲了比較底部的m位,我們將兩個數字向左移位,直到m位全部從左邊掉落(零填充在右邊):

NBITS = 12, n = 4, m = 7: 

    a: 1 2 3 4 x A B C D E F G 
    b: 1 3 2 5 x A B C D E F G 

a >> 8: 0 0 0 0 0 0 0 0 1 2 3 4 
b >> 8: 0 0 0 0 0 0 0 0 1 3 2 5 

a << 5: A B C D E F G 0 0 0 0 0 
b << 5: A B C D E F G 0 0 0 0 0 
0

類似於daddr&(0xffffffff<<(32-prefix)) == entry,也許。