2010-06-30 7 views
2

Я искал SO для получения справки, но не смог найти ответ на мой вопрос.Преобразование маски подсети «/» нотация в стандарт Cisco 0.0.0.0

Ситуация: Мне нужно преобразовать нотацию маски подсети «/ NN» (думаю, IPTABLES) в нотацию 0.0.0.0 cisco.

NN - это число «1» в подмаске, от нижнего октета до более высокого. Каждый октет представляет собой 8-битные целые числа.

Возможное решение:

Сделать массив 32 «0» и заполняя последние цифры NN с «1», то в группе 4 октетов и преобразование в целое ... а/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(); 

ответ

5

Я был смысл, чтобы бросить вместе некоторые общего назначения адреса маскирующие процедуры ...

Вот быстрый и грязный способ конвертировать из 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); 
+0

Благодарим за вопрос: D Я попробую и отправлю отзыв, но перед этим у меня возник вопрос. Результатом будет «255.255» или «0.0.1.255», как cisco? С уважением! – jaderanderson

+0

Это преобразование в стандартную маску подсети «255.255.128.0». Если вам нужна «подстановочная» маска, вы можете взять побитовое ('~') результата перед вызовом 'HostToNetworkOrder', и это даст вам результат вроде« 0.0.1.255 ». –

+0

Спасибо, человек, обновит код с ответом! Оно работает! – jaderanderson

1

То же самое? в Stephens в VB .Net

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 
0

Я бы рекомендовал использовать IPNetwork библиотеки 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 

Удачи!