Forum: PC-Programmierung IP Adresse aus String parsen


von Thomas S. (thomas_s72)


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)


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)


Lesenswert?

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

von Roger S. (edge)


Lesenswert?

1
var IP = System.Net.IPAddress.Parse(MyIP);

Cheers, Roger

von Alexander K. (Gast)


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)


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)


Lesenswert?

RTFM.

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

von guest (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


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)


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


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.