Search code examples
.netmaskiptablesciscosubnet

Converting subnet mask "/" notation to Cisco 0.0.0.0 standard


I've searched SO for help but could'nt find a answer to my question.

Situation: I need to convert a "/NN" subnet mask notation (think IPTABLES) to a 0.0.0.0 cisco notation.

NN are the number of "1" in the submask, from the lowest octet to the higher. Each octet are 8 bit integers.

Possible solution:

Make a array of 32 "0" and filling the last NN digits with "1", then group in 4 octets and converting to int... a /23 mask should be like 0.0.1.255.

My question is how to do it in .NET... i never used binary manipulation and conversion.

Can you guys help me with this solution?

UPDATE - Stephen has answer correctly!

Here is the code ported to .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();

Solution

  • I've been meaning to throw together some general-purpose address masking routines...

    Here's a quick-and-dirty way to convert from CIDR notation to a subnet mask:

    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);