2

SO でヘルプを検索しましたが、質問に対する回答が見つかりませんでした。

状況: 「/NN」サブネット マスク表記 (IPTABLES と考えてください) を 0.0.0.0 cisco 表記に変換する必要があります。

NN は、下位オクテットから上位へのサブマスク内の「1」の数です。各オクテットは 8 ビット整数です。

考えられる解決策:

32 個の「0」の配列を作成し、最後の NN 桁を「1」で埋めてから、4 オクテットにグループ化し、int に変換します... /23 マスクは 0.0.1.255 のようになります。

私の質問は.NETでそれを行う方法です...バイナリ操作と変換を使用したことはありません。

この解決策を手伝ってもらえますか?

更新 - スティーブンは正しく答えました!

.NETに移植されたコードは次のとおりです

        if (p.LastIndexOf("/") < 0 ) return p;
        int mask= Convert.ToInt32("0"+p.Substring(p.LastIndexOf("/")+1,2));

        int zeroBits = 32 - mask; // the number of zero bits
        uint result = uint.MaxValue; // all ones

        // Shift "cidr" and subtract one to create "cidr" one bits;
        //  then move them left the number of zero bits.
        result &= (uint)((((ulong)0x1 << mascara) - 1) << zeroBits);
        result = ~result;
        // Note that the result is in host order, so we'd have to convert
        //  like this before passing to an IPAddress constructor
        result = (uint)IPAddress.HostToNetworkOrder((int)result);
        string convertedMask = new IPAddress(result).ToString();
4

3 に答える 3

6

私は、いくつかの汎用アドレス マスキング ルーチンをまとめるつもりでした...

CIDR表記からサブネット マスクに変換する手っ取り早い方法を次に示します。

var cidr = 23; // e.g., "/23"
var zeroBits = 32 - cidr; // the number of zero bits
var result = uint.MaxValue; // all ones

// Shift "cidr" and subtract one to create "cidr" one bits;
//  then move them left the number of zero bits.
result &= (uint)((((ulong)0x1 << cidr) - 1) << zeroBits);

// Note that the result is in host order, so we'd have to convert
//  like this before passing to an IPAddress constructor
result = (uint)IPAddress.HostToNetworkOrder((int)result);
于 2010-06-30T18:12:02.510 に答える
1

同じ?VB .Net の Stephens として

Function CIDRtoMask(ByVal CIDR As Integer) As String

    If CIDR < 2 OrElse CIDR > 30 Then
        Stop
    End If

    Debug.WriteLine(CIDR.ToString)

    'simulated ip address
    Dim ipAsNum As UInt32 = 3232300291 '192.168.253.3
    Debug.WriteLine(Convert.ToString(ipAsNum, 2).PadLeft(32, "0"c) & " IP as num") 'show binary


    'create mask
    Dim mask As UInt32 = UInt32.MaxValue << (32 - CIDR)
    Debug.WriteLine(Convert.ToString(mask, 2).PadLeft(32, "0"c) & " mask") 'show binary

    Dim CT As UInt32 = UInt32.MaxValue Xor mask 'the zero based count of hosts in network
    Dim NN As UInt32 = ipAsNum And mask 'network number
    Dim NB As UInt32 = NN Or CT 'network broadcast
    Debug.WriteLine(Convert.ToString(CT, 2).PadLeft(32, "0"c) & " CT") 'show binary
    Debug.WriteLine(Convert.ToString(NN, 2).PadLeft(32, "0"c) & " NN") 'show binary
    Debug.WriteLine(Convert.ToString(NB, 2).PadLeft(32, "0"c) & " NB") 'show binary

    'get bytes
    Dim tb() As Byte = BitConverter.GetBytes(mask)
    Array.Reverse(tb)

    'convert to string
    Dim stringMask As String = String.Format("{0}.{1}.{2}.{3}",
                                  tb(0), tb(1), tb(2), tb(3))

    Return stringMask
End Function
于 2010-09-04T16:05:58.237 に答える
1

IPNetwork Library https://github.com/lduchosal/ipnetworkの使用をお勧めします。バージョン 2 の時点で、IPv4 と IPv6 もサポートしています。

IPv4

IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25");

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

出力

Network : 192.168.0.0
Netmask : 255.255.255.128
Cidr : 25

楽しむ !

于 2015-08-11T09:46:03.733 に答える