Eine IP kennt manja in dieser Schreibweise, zB: "127.0.0.64"
Dahinter verbirgt sich schlicht ein Integer, also eine Zahl mit 32 Bits. Obige Schreibweise stellt eben die 4 Bytes eines Unsigned Int32 dar.
Also bekommt man alle IPs in einem durch 2 IPs definierten Range, indem man obige Darstellung in einen UInt32 konvertiert, und dann kann man hochzählen.
Bzw. die Anzahl der in einem Range enthaltenen IPs ergibt sich aus der Subtraktion der höheren von der niedrigeren.
Mein Sample:
Dahinter verbirgt sich schlicht ein Integer, also eine Zahl mit 32 Bits. Obige Schreibweise stellt eben die 4 Bytes eines Unsigned Int32 dar.
Also bekommt man alle IPs in einem durch 2 IPs definierten Range, indem man obige Darstellung in einen UInt32 konvertiert, und dann kann man hochzählen.
Bzw. die Anzahl der in einem Range enthaltenen IPs ergibt sich aus der Subtraktion der höheren von der niedrigeren.
Mein Sample:
VB.NET-Quellcode
- Imports System.ComponentModel
- Public Class Form1
- Private _IPs As New BindingList(Of String)
- Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
- ListBox1.DataSource = _IPs
- End Sub
- Private Function IP2Int(ByVal ip As String) As UInt32
- 'split zerteilt ip in 4 strings, die je eine Zahl darstellen
- 'Byte.Parse wandelt je ein Segment in ein Byte um
- 'Select sammelt diese Bytes in ein IEnumerable(Of Bytes)
- 'ToArray macht daraus ein Byte-Array
- Dim bytes = (From s In ip.Split("."c) Select Byte.Parse(s)).ToArray
- Array.Reverse(bytes) 'dreht die Reihenfolge um
- Dim integers(0) As UInt32 'ein Array von UInt32 mit nur einem Element
- ' (ein Integer ist genauso groß wie 4 Bytes)
- 'BlockCopy kann ein Array des einen Typs byte-weise umkopieren in ein Array eines anderen Typs
- 'kopiert also die 4 Bytes auf den UInt32
- Buffer.BlockCopy(bytes, 0, integers, 0, 4)
- Return integers(0) 'den UInt32 returnen
- End Function
- Private Function Int2IP(ByVal n As UInt32) As String
- Dim integers = New UInt32() {n} 'ein Array von UInt32 mit nur dem einem Element
- Dim bytes(3) As Byte 'Array mit 4 Bytes
- Buffer.BlockCopy(integers, 0, bytes, 0, 4) 'den UInt32 auf die 4 Bytes kopieren
- Array.Reverse(bytes) 'reihenfolge umdrehen
- 'Byte-Array in ein String-Array konvertieren
- Dim strings = bytes.Select(Function(b) b.ToString)
- 'Strings verketten und returnen
- Return String.Join(".", strings.ToArray)
- End Function
- Private Sub btStart_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btStart.Click
- Dim ip0 = txtStartIP.Text
- Dim ip1 = txtEndIP.Text
- 'Zur Geschwindigkeitsoptimierung wird das Databinding temporär ausgesetzt
- _IPs.RaiseListChangedEvents = False
- _IPs.Clear()
- 'Die Schleife zählt von der einen ip-Repräsentation zur anderen
- For i = IP2Int(ip0) To IP2Int(ip1)
- _IPs.Add(Int2IP(i)) 'zurückgewandelte ip-Repräsentationen ausgeben
- Next
- _IPs.RaiseListChangedEvents = True
- _IPs.ResetBindings()
- End Sub
- End Class