我必須將2個DWORD,IP地址和網絡掩碼轉換爲CDIR格式...因此,我有2個DWORD對應1.1.1.1和255.255.255.255,我想要字符串 1.1.1.1/32在C++中將網絡掩碼轉換爲CIDR格式
對此有何看法?
由於
我必須將2個DWORD,IP地址和網絡掩碼轉換爲CDIR格式...因此,我有2個DWORD對應1.1.1.1和255.255.255.255,我想要字符串 1.1.1.1/32在C++中將網絡掩碼轉換爲CIDR格式
對此有何看法?
由於
的前綴長度是等於在子網掩碼的二進制表示(前導)的人的數量。所以你只需要計算(領先)的數量。
或[尾隨零]的數量(http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set) – Nemo
如果您有大量這些工作要做,則效率不高,因爲它一次只能處理一個位。但非常直接的方法來計算網絡掩碼中的每個位:
int cidr = 0;
while (netmask)
{
cidr += (netmask & 0x01);
netmask >>= 1;
}
然後將IP地址與此CIDR值組合。
最簡單的方法:
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;
}
還有,你試過這麼遠嗎? –
這不是CDIR,而是CIDR:無類域間路由。 – robert