2011-07-11 64 views
1

我必須將2個DWORD,IP地址和網絡掩碼轉換爲CDIR格式...因此,我有2個DWORD對應1.1.1.1和255.255.255.255,我想要字符串 1.1.1.1/32在C++中將網絡掩碼轉換爲CIDR格式

對此有何看法?

由於

+0

還有,你試過這麼遠嗎? –

+0

這不是CDIR,而是CIDR:無類域間路由。 – robert

回答

3

由於有一個小的固定數量的有效網絡掩碼(準確地說,32個),最快的方法可能是在初始化時將掩碼映射到前綴長度一次,而轉換隻是查找在地圖中。

+0

我認爲這是最簡單的方法,由於固定尺寸。 – reza

2

的前綴長度是等於在子網掩碼的二進制表示(前導)的人的數量。所以你只需要計算(領先)的數量。

+1

或[尾隨零]的數量(http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set) – Nemo

0

如果您有大量這些工作要做,則效率不高,因爲它一次只能處理一個位。但非常直接的方法來計算網絡掩碼中的每個位:

int cidr = 0; 
while (netmask) 
{ 
    cidr += (netmask & 0x01); 
    netmask >>= 1; 
} 

然後將IP地址與此CIDR值組合。

2

最簡單的方法:

static unsigned short toCidr(char* ipAddress) 
    { 
     unsigned short netmask_cidr; 
     int ipbytes[4]; 

     netmask_cidr=0; 
     sscanf(ipAddress, "%d.%d.%d.%d", &ipbytes[0], &ipbytes[1], &ipbytes[2], &ipbytes[3]); 

     for (int i=0; i<4; i++) 
     { 
      switch(ipbytes[i]) 
      { 
       case 0x80: 
        netmask_cidr+=1; 
        break; 

       case 0xC0: 
        netmask_cidr+=2; 
        break; 

       case 0xE0: 
        netmask_cidr+=3; 
        break; 

       case 0xF0: 
        netmask_cidr+=4; 
        break; 

       case 0xF8: 
        netmask_cidr+=5; 
        break; 

       case 0xFC: 
        netmask_cidr+=6; 
        break; 

       case 0xFE: 
        netmask_cidr+=7; 
        break; 

       case 0xFF: 
        netmask_cidr+=8; 
        break; 

       default: 
        return netmask_cidr; 
        break; 
      } 
     } 

     return netmask_cidr; 
    }