formatfehler beim konvertieren einer zahl zur basis 2

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Umbekannt.

    formatfehler beim konvertieren einer zahl zur basis 2

    Moin moin,

    ich schreibe momentan an einer methode zur analyse der ip range einer addresse zu einer subnetzmaske, allerdings habe ich dabei ein klitze kleines problem.

    Und zwar versuche ich die übergebene Ipadresse(ein array) in eine binärzahl zu konvertieren. Soweit so gut, allerdings passiert beim konvertieren ne exeption "formatfehler".

    Ich hab schon so einiges probiert damit. Zur Basis 10 funktionier das konvertieren wunderbar, allerdings ist das nicht das was ich will.

    Hier mein sourcecode:

    Übergeben wird ein Stringarray bestehend aus 4 einträgen jeweils mit 3 stelligen zahlen ( ja ich weiß string ist hier nicht angemessen)
    Importiert ist system.Convert

    VB.NET-Quellcode

    1. Dim binipString As String = Nothing
    2. For i = 0 To 3
    3. binipString &= ToInt32(ip(i), 2)
    4. Next


    Beim konvertieren von ip(i) zum binärwert tritt der fehler bei mir auf. Evtl. weiß einer ja einen rat warum.

    Übergeben tuh ich ein array bestehend aus 4 werten (192, 168, 1 , 1)
    das geht schon gar nicht, da wird mir sofort nen syntax fehler eingeblendet bevor ich das versuche zu debuggen

    Selbst wenn ich versuche den konvertierten wert ohne zwischenspeicherung in einer messagebox auszugeben mauelt er rum von wegen format fehler
    Geh mal mit dem Cursor auf

    VB.NET-Quellcode

    1. ToInt32()
    und drücke die Taste "F1". :thumbsup:
    Lerne, was die Funktion ToInt32 überhaupt macht.
    Sie konvertiert nicht etwa eine Zahl in Binärformat, wenn eine 2 als Parameter folgt, sondern sie konvertiert einen String, der eine Binärzahl darstellt, in ein Intreger.
    Überdenke das Problem neu und poste mal ein besseres Stück Code, dann sehen wir weiter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Warum willst du IPs binär darstellen?

    Ich hab grad einen "IPConverter" in den SourceCodeAustausch gemacht, aber der wird erst demnächst freigeschaltet. Aber ich kann dirja eine exclusiv-Vorstellung geben:

    Eine IP ist nix als die Darstellung eines Integers, und zwar ist jedes Byte als Zahl im Zehnersystem notiert, Trenner ist ".".

    Berechnungen lassen sich also super-einfach anstellen, indem man die Text-Darstellung in einen UInt32 konvertiert.

    Übrigens kann man einen UInt32 auch mit System.Convert.ToString(number, numberBase) als binärstring darstellen, wenn man als numberBase 2 angibt. Jdfs. hier mein Code:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Form1
    3. Private _IPs As New BindingList(Of String)
    4. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    5. ListBox1.DataSource = _IPs
    6. End Sub
    7. Private Function IP2Int(ByVal ip As String) As UInt32
    8. 'split zerteilt ip in 4 strings, die je eine Zahl darstellen
    9. 'Byte.Parse wandelt je ein Segment in ein Byte um
    10. 'Select sammelt diese Bytes in ein IEnumerable(Of Bytes)
    11. 'ToArray macht daraus ein Byte-Array
    12. Dim bytes = (From s In ip.Split("."c) Select Byte.Parse(s)).ToArray
    13. Array.Reverse(bytes) 'dreht die Reihenfolge um
    14. Dim integers(0) As UInt32 'ein Array von UInt32 mit nur einem Element
    15. ' (ein Integer ist genauso groß wie 4 Bytes)
    16. 'BlockCopy kann ein Array des einen Typs byte-weise umkopieren in ein Array eines anderen Typs
    17. 'kopiert also die 4 Bytes auf den UInt32
    18. Buffer.BlockCopy(bytes, 0, integers, 0, 4)
    19. Return integers(0) 'den UInt32 returnen
    20. End Function
    21. Private Function Int2IP(ByVal n As UInt32) As String
    22. Dim integers = New UInt32() {n} 'ein Array von UInt32 mit nur dem einem Element
    23. Dim bytes(3) As Byte 'Array mit 4 Bytes
    24. Buffer.BlockCopy(integers, 0, bytes, 0, 4) 'den UInt32 auf die 4 Bytes kopieren
    25. Array.Reverse(bytes) 'reihenfolge umdrehen
    26. 'Byte-Array in ein String-Array konvertieren
    27. Dim strings = bytes.Select(Function(b) b.ToString)
    28. 'Strings verketten und returnen
    29. Return String.Join(".", strings.ToArray)
    30. End Function
    31. Private Sub btStart_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btStart.Click
    32. Dim ip0 = txtStartIP.Text
    33. Dim ip1 = txtEndIP.Text
    34. 'Zur Geschwindigkeitsoptimierung wird das Databinding temporär ausgesetzt
    35. _IPs.RaiseListChangedEvents = False
    36. _IPs.Clear()
    37. 'Die Schleife zählt von der einen ip-Repräsentation zur anderen
    38. For i = IP2Int(ip0) To IP2Int(ip1)
    39. _IPs.Add(Int2IP(i)) 'zurückgewandelte ip-Repräsentationen ausgeben
    40. Next
    41. _IPs.RaiseListChangedEvents = True
    42. _IPs.ResetBindings()
    43. End Sub
    44. End Class
    Dateien
    • IPConverter.zip

      (14,72 kB, 95 mal heruntergeladen, zuletzt: )
    nun warum ich die ip addresse in binär haben will ist ganz einfach, wenn man subnetting betreiben will so muss man schon wissen was die netzID eines netzwerkes ist und was die broadcast ip ist.

    Und ich schreibe mir gerade ein tool zum automatisieren der subnetzmasken berechnung für ip-addressen.

    Für gewöhnlich funktioniert es ja so das man anhand einer logischen vergleichung von einzelnen bits der subnetzmaske und der ip-addresse in binärer darstellung die netzid in binärer darstellung schlussfolgern.
    Die wird wieder in dezimal dotted umgewandelt, dann hat man die netzID als dezimal dotted.

    Ganz einfach.

    Um die Broadcast ip zu berechnen benötige ich die netzID als binär, um daraus dann den broadcast zu bilden in binärer darstellung.

    Ganz einfach.

    und wie ich die Ip in eine binäre Darstellung konvertiert bekomme habe ich auch schon raus, allerdings die variante die mit die konvertierung mittels ToInt32() bietet ist nicht die gewünschte ist mir gestern abend aufgefallen.

    Ich brauche für mein vorhaben auch die bits die vor der zahl auf 0 stehen. Denn letztendlich brauche ich eine binärzahl aus 32 stellen.
    mag sein das jeder integer 32 bit hat, das ist allerdings immer noch nicht das worauf meine aussage bezogen war.

    Ich geb es hier an dieser Stelle mal auf, hat keinen Sinn darüber weiter zu diskutieren, wer ahnung von subnetting hat darf sich bitte hier nochmal melden und mir evtl. einen tipp zum lösen geben.

    Alles andere hier in diesem Thread war mir keinesfalls hilfreich und ging kaum bis gar nicht in die richtung meiner frage.