2009-06-24 17 views
14

CIDR表記(72.20.10.0/24)のネットワークをIPアドレスの範囲に変換するC#コードを見つけるのにかなり苦労しました。 stackoverlowにはCIDRに関するいくつかのスレッドがありますが、どれもC#コードがなくても必要なものを正確にカバーしているようです。そこで私は自分でそれを調理することにしました。このバージョンでは、コードがSystem.Netに依存することは望ましくありませんでした。CIDRをC#でネットワークとIPアドレスの範囲に変換する方法は?

おそらく、それは誰かに役立つかもしれません。

参照:http://www.laffeycomputer.com/whatmask.html

使用から

What's the best way to convert from network bitcount to netmask?

"Whatmask" Cコード:

uint startIP, endIP; 
Network2IpRange("72.20.10.0/24", out startIP, out endIP); 

コードはすべて32ビットを想定しています。

static void Network2IpRange(string sNetwork, out uint startIP, out uint endIP) 
{   
    uint ip,  /* ip address */ 
     mask,  /* subnet mask */    
     broadcast, /* Broadcast address */ 
     network; /* Network address */ 

    int bits;    

    string[] elements = sNetwork.Split(new Char[] { '/' });   

    ip = IP2Int(elements[0]); 
    bits = Convert.ToInt32(elements[1]); 

    mask = ~(0xffffffff >> bits); 

    network = ip & mask; 
    broadcast = network + ~mask; 

    usableIps = (bits >30)?0:(broadcast - network - 1); 

    if (usableIps <= 0) 
    { 
     startIP = endIP = 0; 
    } 
    else 
    { 
     startIP = network + 1;    
     endIP = broadcast - 1; 
    } 
} 

public static uint IP2Int(string IPNumber) 
{ 
    uint ip = 0; 
    string[] elements = IPNumber.Split(new Char[] { '.' }); 
    if (elements.Length==4) 
    { 
     ip = Convert.ToUInt32(elements[0])<<24; 
     ip += Convert.ToUInt32(elements[1])<<16; 
     ip += Convert.ToUInt32(elements[2])<<8; 
     ip += Convert.ToUInt32(elements[3]); 
    } 
    return ip; 
} 

あなたの改善を依頼してください。

+0

私には感謝してくれました。 –

答えて

3

の手順は、これらの2つの方法のいずれかでmaskを計算network/maskBits

のために、このように行くだろう、

mask = ~((1 << (32 - maskBits)) - 1) // or, 
mask = ~(0xFFFFFFFF >> maskBits) 

そして範囲は、より正確に

StartIP = network 
EndIP = network | ~mask 

です、

StartIP = network & mask 
EndIP = (network & mask) | ~mask 

  • <<は(ロールオーバーなし)ビット単位の左シフト
  • &はビット単位でAND、
  • |
  • はビット単位でOR、および
  • ~は、ビット単位のINVERTです。ここで
+0

'maskBits'が32のとき、' mask =〜(0xFFFFFFFF >> maskBits) 'は正しい値を生成しません - 値は0xFFFFFFFFではなく0x0になります –

+0

実際には、これらのメソッドのどちらも動作しませんでした。 '〜(0xFFFFFFFF >> 24)'は '255.255.255.0'ではなく' 0.255.255.255'を返します。私にとってうまくいったのは、 '0xFFFFFFFF >> -24'でした – cogumel0

6

、あなたはあなたの例72.20.10.0/24のためにそれを行う方法です

Network72.20.10.0
Mask~((1 << (32-24)) - 1) //または
Mask0xFFFFFF00 ある~(0xFFFFFFFF >> 24)

  • であるとします

    スタートIPは - (Network & Mask)です。 72.20.10.0 & 0xFFFFFF00

ある

  • EndIPは - ((Network & Mask) | ~Mask)。これは72.20.10.0 -- 72.20.10.255なります(72.20.10.0 & 0xFFFFFF00) | 0x000000FF

ある

17

GithubのC#IPNetworkクラスを使用することをお勧めします。

string net = "192.168.168.100/24"; 
IPNetwork ipnetwork = IPNetwork.Parse(net); 

Console.WriteLine("Network : {0}", ipnetwork.Network); 
Console.WriteLine("Netmask : {0}", ipnetwork.Netmask); 
Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast); 
Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable); 
Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable); 
Console.WriteLine("Usable : {0}", ipnetwork.Usable); 
Console.WriteLine("Cidr : {0}", ipnetwork.Cidr); 

それは楽しみを持っている

Network : 192.168.168.0 
Netmask : 255.255.255.0 
Broadcast : 192.168.168.255 
FirstUsable : 192.168.168.1 
LastUsable : 192.168.168.254 
Usable : 254 
Cidr : 24 

を出力に含まれます。ここで

2

は、T-SQL、from my blog post内の範囲にCIDR表記に変換する方法は次のとおりです。

http://www.stardeveloper.comから)SQL Serverでこの機能を事前に作成する最初の。

CREATE FUNCTION [dbo].[ConvertIPToLong](@IP varchar(15)) 
RETURNS bigint 
AS 
BEGIN 
    DECLARE @Long bigint 
    SET @Long = CONVERT(bigint, PARSENAME(@IP, 4)) * 256 * 256 * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 3)) * 256 * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 2)) * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 1)) 

    RETURN (@Long) 
END 

これは 低および高IPがCIDRアドレスの範囲を計算します、私は一緒に入れT-SQLコードのサンプルです。それは乱雑で、私は にT-SQLのビットシフト演算子の不足を回避しなければならなかった。

Declare @CidrIP varchar(50) 
Set @CidrIP = '10.100.60.55/28' 

Select dbo.[ConvertIPToLong](left(@CidrIP, patindex('%/%' , @CidrIP) - 1)) & (cast(4294967295 as bigint)^(Power(2, 32 - Cast(substring(@CidrIP, patindex('%/%' , @CidrIP) + 1, 2) as int)) - 1)) as LowRange, 
     dbo.[ConvertIPToLong](left(@CidrIP, patindex('%/%' , @CidrIP) - 1)) & (cast(4294967295 as bigint)^(Power(2, 32 - Cast(substring(@CidrIP, patindex('%/%' , @CidrIP) + 1, 2) as int)) - 1)) + (Power(2, 32 - Cast(substring(@CidrIP, patindex('%/%' , @CidrIP) + 1, 2) as int)) - 1) 
関連する問題