2011-01-16 4 views
0

Ich habe eine Anforderung, um die Anzahl der IP-Adressen in einem IP-Bereich zu erhalten, der von einem startIP und einem endIP für IPv4- und IPv6-Bereiche identifiziert wird.Wie subtrahiere ich eine IP-Adresse? (sowohl IPv4 als auch IPv6)

Kann jemand auf Möglichkeiten hinweisen, die verwendet werden können, um die Subtraktion von IP-Adressen zu erreichen?

Die Anzahl der IP-Adressen werden = IP-Bereichsende - StarTip + 1

Alle Antworten sehr geschätzt werden.

+3

Sie werden ein wenig klären müssen: auf eine nullte Näherung, kann man einfach die Adresse in einem 32 oder 128-Bit-Integer ohne Vorzeichen konvertieren und diese Werte subtrahieren. Allerdings: das sagt Ihnen nicht, wie viele unterschiedliche zuweisbare IPs Sie erhalten, weil es Broadcast-IPs zählt und Subnetze nicht berücksichtigt. –

+0

Broadcast-Adressen oder andere spezielle Adressen sind nicht wichtig. Meine Anforderung besteht darin, die arithmetische Differenz zweier IP-Adressen und der Datenstrukturen in C# zu ermitteln, die solche Werte enthalten können (speziell ipv6). – user412272

Antwort

2

Wie ist das?

class Program 
{ 

    static void Main(string[] args) 
    { 
     IPAddress a = new IPAddress(new byte[] { 192, 168, 11, 12 }); 
     IPAddress b = new IPAddress(new byte[] { 192, 168, 12, 12 }); 
     long diff = Difference(a, b); 
    } 

    private static Int64 ConvertToLong(IPAddress a) 
    { 
     byte[] addressBits = a.GetAddressBytes(); 
     Int64 retval = 0; 
     for (int i = 0; i < addressBits.Length; i++) 
     { 
      retval = (retval << 8) + (int)addressBits[i]; 
     } 

     return retval; 
    } 

    private static Int64 Difference(IPAddress a, IPAddress b) 
    { 
     return Math.Abs(ConvertToLong(a) - ConvertToLong(b)) - 1; 
    } 

} 
1
class Program   
{ 
static void Main(string[] args) 
    { 
     string a = "192.168.11.12"; 
     string b = "192.168.12.12"; 
     int diff = Math.Abs(IPToInt(a) - IPToInt(b)) + 1; 
    } 
int IPToInt(string IP) 
{ 
    return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(IP).GetAddressBytes(), 0)); 
}  
}