Forum: PC-Programmierung IP Adresse aus String parsen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas S. (thomas_s72)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
gerade versuche ich ein Youtube Video über TCPIP Kommunikation in C# 
nachzustellen und habe folgendes Problem. In der Zeile wo ich die IP 
Adresse für den Server berechne kommt immer ein Absturz:

System.FormatException: Die Eingabezeichenfolge hat das falsche Format.
   bei System.Number.StringToNumber(String str, NumberStyles options, 
NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   bei System.Number.ParseInt64(String value, NumberStyles options, 
NumberFormatInfo numfmt)

Meine IP ist vorab so definiert:
String MyIP = "127.0.0.1";

Die Programmzeile die es dann verursacht ist diese:
System.Net.IPAddress IP = new System.Net.IPAddress(long.Parse(MyIP));

Der Absturz kommt von den Punkten, wenn ich da einfach mal eine Zahl 
eintippe stürzt nix ab (und ich bekomme eine falsche IP Adresse 
natürlich..):

String MyIP = "1272234"; -> Kein Absturz!! IP ist natürlich Humbug..

Das Parsen ist genau wie im Video, wieso ist das Format ungültig? Ich 
hab schon eine Stunde herum gegoogelt finde aber kein brauchbares 
Besipiel.
Hat jemand ein Beispiel?
Besten Dank, Thomas

von Oliver S. (oliverso)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe keine Ahnung von C#, und schaue mir auch keine YouTube-Videos 
über proggen an.

Aber ich habe eine Vermutung, was long.parse() erwartet. Genaueres 
sollte in der Dokumentation dazu stehen. Wenn ich Microsoft richtig 
einschätze, ist die genau eine F1-Tastendruck entfernt.

Oliver

von Thomas Z. (usbman)


Bewertung
1 lesenswert
nicht lesenswert
Warum fragst du uns? Ich würde entweder Programmieren lernen oder 
vielleicht youtube fragen wie das geht......

von Roger S. (edge)


Bewertung
0 lesenswert
nicht lesenswert
var IP = System.Net.IPAddress.Parse(MyIP);

Cheers, Roger

von Alexander K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe dein Problem nicht.

Du hast du IP als String.  Was soll den daraus werden ?

Wenn du die Nummerisch brauchst musst du 4 Variabeln anlegen. Und das 
Teil in einer Schleife auseinander rupfen. Also 4 Strings binden. Dazu 
benutze ich die MID-Funktion und eine nette kleine For-Next Schleife.

Sollen die nun einzelnen Blöcke eine Zahl werden reicht ein einfacher 
VAL Befehl.

Falls du den Code dazu nicht schaffst lerne einfach mal die Behandlung 
von Strings oder Frag mich ;) Denn DAS ist Anfängertechnik.


Gruß

  Pucki

von Jan B. (do9jhb)


Bewertung
0 lesenswert
nicht lesenswert
Benutz einfach IPAdress.parse() 
(https://docs.microsoft.com/de-de/dotnet/api/system.net.ipaddress.parse?view=netcore-3.1).

Dann brauchst du diesen seltsamen Zwischenschritt über Long nicht und er 
kann auch mit ipv6 und den exotischeres ipv4 Formaten (z.b. 20.65535) 
korrekt umgehen.

Auf der Seite von MS gibts auch ein Beispiel...

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
RTFM.

Die IPAddress Klasse kennt selber ein Parse(String):
System.Net.IPAddress IP = System.Net.IPAddress.Parse(MyIP);

von guest (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Eine Alternative wäre Dns.GetHostAddresses, das kann sowohl mit IPs (als 
String) als auch mit Hostnamen umgehen.

von Εrnst B. (ernst)


Bewertung
0 lesenswert
nicht lesenswert
Alexander K. schrieb:
> Wenn du die Nummerisch brauchst musst du 4 Variabeln anlegen. Und das
> Teil in einer Schleife auseinander rupfen. Also 4 Strings binden.

Möööp. Reingefallen.

Bei der Angabe von nummerischen IPv4-Adressen darf man manche "0x00"-er 
Bytes weglassen. (*)

d.H. "1.1" ist eine gültige Angabe und dasselbe wie 1.0.0.1 (Cloudflare 
Public DNS)
"127.1" ist dasselbe wie "127.0.0.1"
"192.168.42" ist dasselbe wie "192.168.0.42".

*) Exakter: Wenn drei Blöcke angegeben sind, wird der letzte als 16Bit, 
bei nur zweien als 24 Bit ausgewertet, deshalb geht auch sowas:

Jan B. schrieb:
> exotischeres ipv4 Formaten (z.b. 20.65535)

Nettes Andenken an 1980 :)

d.H.:

Alexander K. schrieb:
> eine nette kleine For-Next Schleife.

reicht nicht ganz. Du musst nach '.' trennen, die Trennstücke zählen, 
nach uint wandlen, alle bis auf den letzten auf 8 Bit limitieren, den 
letzten auf die übriggebliebenen Bits limitieren, entsprechend shiften, 
und zusammen-odern.

Schöne Fingerübung für Bitoperationen, ansonsten nimm lieber die 
fertigen Funktionen aus deinem Framework.

: Bearbeitet durch User
von äxl (Gast)


Bewertung
0 lesenswert
nicht lesenswert
regmatchEx oderso. da kann man das gut mit wandeln...
Müsste ich aber auch erst am Rechner nachsehen
Aber ne lösung wurde ja schon genannt. IPAdress kann das von sich aus.

von Johannes S. (jojos)


Bewertung
0 lesenswert
nicht lesenswert
Εrnst B. schrieb:
> Bei der Angabe von nummerischen IPv4-Adressen darf man manche "0x00"-er
> Bytes weglassen. (*)

das ist richtig, aber so wenig bekannt, das man sich kaum darauf 
verlassen kann.
Wenn mit C Standardfunktionen zerlegt wird gibts noch die Falle das zB 
ein '070' einen octal Wert von dez. 56 darstellt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.