2011-07-11 55 views
1

2 DWORD、IPアドレス、ネットワークマスクをCDIR形式に変換する必要があります... したがって、1.1.1.1と255.255.255.255に対応する2 DWORDがあります。文字列 1.1.1.1/32C言語でのCIDR形式へのネットマスク変換

これについてのご意見はありますか?

おかげ

+0

そして、あなたがこれまでに試してみましたか? –

+0

CDIRではなくCIDR:クラスレスドメイン間ルーティングです。 – robert

答えて

3

有効なネットマスクが32個(正確には32個)あるため、最も早い方法は、初期化時にプレフィックス長にマスクのマップを作成して変換するだけです地図上に表示されます。

+0

私はこれが固定されたサイズ。 – reza

2

プレフィックス長サブネットマスクのバイナリ表現で(先頭)のものの数に等しいです。だから、あなたは(先導する)人の数を数えるだけです。

+1

または[末尾のゼロ]の数(http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set) – Nemo

0

これらの処理が大量であると効率的ではありません。一度に1つずつ処理が進むため、効率的ではありません。しかし、ネットマスクの各ビットを数える非常に簡単な方法:

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

次に、このCIDR値とIPアドレスを結合します。

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; 
    } 
関連する問題