2010-06-30 2 views
2

J'ai recherché SO pour de l'aide mais je n'ai pas pu trouver de réponse à ma question.Conversion de la notation "/" du masque de sous-réseau en norme Cisco 0.0.0.0

Situation: J'ai besoin de convertir une notation de masque de sous-réseau "/ NN" (pensez IPTABLES) à une notation Cisco 0.0.0.0. NN sont le nombre de "1" dans le sous-masque, de l'octet le plus bas à l'octet le plus haut. Chaque octet est un entier de 8 bits.

solution possible:

plus d'un réseau de 32 "0" et remplir les derniers chiffres NN "1", puis en groupe de 4 octets et convertir en int ... a/23 masque devrait être comme 0,0 .1.255.

Ma question est de savoir comment le faire en .NET ... je n'ai jamais utilisé la manipulation binaire et la conversion.

Pouvez-vous m'aider avec cette solution?

MISE À JOUR - Stephen a répondu correctement!

Voici le code à Ported

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

Répondre

5

J'ai eu l'intention de jeter ensemble quelques routines de masquage d'adresse à usage général ...

Voici un moyen rapide et sale convertir de la notation CIDR en un masque de sous-réseau:

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

Merci d'avoir répondu: D Je vais essayer et poster les commentaires, mais avant j'ai une question. Le résultat sera le "255.255" ou le "0.0.1.255" comme le cisco? Cordialement! – jaderanderson

+0

Ceci est converti en un masque de sous-réseau standard "255.255.128.0". Si vous avez besoin d'un masque "générique", alors vous pouvez prendre le bitwise ('~') du résultat avant d'appeler 'HostToNetworkOrder', et cela vous donnera un résultat comme" 0.0.1.255 ". –

+0

Merci l'homme, mettra à jour le code avec la réponse! Ça marche! – jaderanderson

1

Identique? comme Stephens en 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

Je recommande l'utilisation de la bibliothèque IPNetwork https://github.com/lduchosal/ipnetwork. Depuis la version 2, il prend également en charge IPv4 et 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); 

Sortie

Network : 192.168.0.0 
Netmask : 255.255.255.128 
Cidr : 25 

Amusez-vous!

Questions connexes