17

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

おそらくそれは誰かの助けになるかもしれません。

参照:

ネットワークビットカウントからネットマスクに変換する最良の方法は何ですか?

http://www.laffeycomputer.com/whatmask.htmlの「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;
}

お気軽に改善点を提出してください。

4

4 に答える 4

21

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

楽しむ。

于 2009-07-12T16:00:52.037 に答える
9

あなたの例72.20.10.0/24でそれを行う方法は次のとおりです。

//またはNetwork_ 72.20.10.0
Mask_ _~((1 << (32-24)) - 1)
Mask~(0xFFFFFFFF >> 24)

  • これは0xFFFFFF00

StartIPは --(Network & Mask)です。

  • これは72.20.10.0 & 0xFFFFFF00

EndIPは --((Network & Mask) | ~Mask)です。

  • これは(72.20.10.0 & 0xFFFFFF00) | 0x000000FF

これは になります72.20.10.0 -- 72.20.10.255

于 2009-06-24T12:46:30.817 に答える
4

の場合、手順は次のようになりますnetwork/maskBits

maskこれら 2 つの方法のいずれかで を計算します。

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

範囲は、

StartIP = network 
EndIP   = network | ~mask

より正確に、

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

どこ、

  • <<ビット単位の左シフトです (ロールオーバーなし)
  • &はビットごとの AND です。
  • |はビットごとの OR であり、
  • ~ビット単位の INVERT です。
于 2009-06-24T12:34:28.530 に答える
3

私のブログ投稿から、 CIDR表記をT-SQLの範囲に変換する方法は次のとおりです。

まず、SQL Server でこの関数を事前に作成します ( http://www.stardeveloper.comから)。

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

これは、CIDR アドレスから IP 範囲の下限と上限を計算するためにまとめた 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)
于 2011-02-14T17:42:57.537 に答える