![]() |
IP-Adresse von String nach Integer wandeln
Hallole miteinand',
da hab ich jetzt mal ein umgedrehtes Problem. Tausende von Beiträgen erzählen, wie man aus einem Integer einen IP-String bekommt. Ich brauch das jetzt aber andersherum. Also meine Frage: Weiss jemand, wie man eine IP Adresse, die als String ('192.168.0.1') vorliegt in ein DWord bekommt? Gruß Frank :drunken: |
Re: IP-Adresse von String nach Integer wandeln
|
Re: IP-Adresse von String nach Integer wandeln
Hallo,
diesen Beitrag hab ich bereits gesichtet. Doch da wird immer nur von Int > Str gewandelt. Ich brauchs umgedreht! |
Re: IP-Adresse von String nach Integer wandeln
Unterteil den String an den Punkten in 4 Strings:
![]() diese Strings wandelst du mit StrToInt um undfertig. Mfg Tobi |
Re: IP-Adresse von String nach Integer wandeln
Mh.. wenn ich das richtig verstehe, willst Du aus einem IP-String einen Word-Wert machen. Das ist zwar möglich, indem Du die Punkte entfernst und dann einfach in Word umwandelst, hat aber relativ wenig Sinn. Da eine IP aus 4 Byte-Werten besteht, würdest Du im Nachhinein dieses Word-Wert nicht mehr eindeutig in einen String wert umwandeln können. Warum speicherst Du nicht die IP in einem Byte-Array?
|
Re: IP-Adresse von String nach Integer wandeln
Zitat:
Zitat:
marabu |
Re: IP-Adresse von String nach Integer wandeln
Sorry Marabu,
ich hatte die Funktion von inet_addr anders in Erinnerung. Aber Du hast recht, das Teil macht was ich brauche. Danke an alle für die schnelle Hilfe! Gruß Frank |
AW: IP-Adresse von String nach Integer wandeln
Ich habe jetzt auch das Problem. Allerdings bräuchte ich die IP-Adresse in vier Integers für die Nachricht IPM_SETADDRESS und das Makro MAKEIPADDRESS.
Hat da jemand eine Idee ohne Explode zu nutzen? Explode kommt mir dafür etwas übertrieben vor. |
AW: IP-Adresse von String nach Integer wandeln
Mit einer Stringliste
Delphi-Quellcode:
var
sl: TStrings; ... begin sl := TStringList.Create; sl.Delimiter = '.'; block1 := StrToIntDef(sl[0], 0); ... |
AW: IP-Adresse von String nach Integer wandeln
*patsch*
Man merk, das sich lange nicht mehr programmiert habe. ;) Aber irgendwie scheint das nicht zu funktionieren.
Delphi-Quellcode:
Da bekomme ich bei b1 ein "Listenindex überschreitet das Maximum". Der Ip-String ist aber korrekt: "192.168.2.102".
procedure IpStrToBytes(IPStr: string; var b0: Byte; var b1: Byte; var b2: Byte; var b3: Byte);
var sl: TStringList; begin sl := TStringList.Create; try sl.Text := IpStr; sl.Delimiter := '.'; b0 := StrToIntDef(sl[0], 0); b1 := StrToIntDef(sl[1], 0); b2 := StrToIntDef(sl[2], 0); b3 := StrToIntDef(sl[3], 0); finally sl.Free; end; end; Was mache ich da noch falsch? |
AW: IP-Adresse von String nach Integer wandeln
siehe
Delphi-Quellcode:
läßt sich über PosEx bestimmt noch optimieren
Class Operator Implicit(Value: String): TIP;
Delphi-Quellcode:
Const WC_IPADDRESS               = 'SysIPAddress32';
  // IP Address Edit Control Messages   IPM_CLEARADDRESS               = WM_USER + 100;   IPM_SETADDRESS                 = WM_USER + 101;   IPM_GETADDRESS                 = WM_USER + 102;   IPM_SETRANGE                   = WM_USER + 103;   IPM_SETFOCUS                   = WM_USER + 104;   IPM_ISBLANK                    = WM_USER + 105;   // IP Address Edit Control Notification Codes   IPN_FIELDCHANGED               = IPN_FIRST - 0; Type NMIPADDRESS = packed Record {IPN_FIELDCHANGED}     hdr:    NMHDR;     iField: _INT;     iValue: _INT;   End;   pNMIPADDRESS = ^NMIPADDRESS;   TIP = packed Record   Private     _IP: packed Record  Case Integer of       0: (B: Array[0..3] of Byte);       1: (L: LongInt);     End;     Procedure _SetIP (IP: LongInt);               Inline;     Function  _GetIP:     LongInt;                Inline;     Procedure _SetIPx(Index: Integer; IPx: Byte); Inline;     Function  _GetIPx(Index: Integer):     Byte;  Inline;   Public     Class Operator Implicit          (Value:       LongInt): TIP;     Inline;     Class Operator Implicit          (Value:       String):  TIP;     Class Operator Implicit          (Rec:         TIP):     LongInt; Inline;     Class Operator Implicit          (Rec:         TIP):     String;     Class Operator Equal             (Left, Right: LongInt): Boolean; Inline;     Class Operator NotEqual          (Left, Right: LongInt): Boolean; Inline;     Class Operator LessThanOrEqual   (Left, Right: LongInt): Boolean; Inline;     Class Operator LessThan          (Left, Right: LongInt): Boolean; Inline;     Class Operator GreaterThan       (Left, Right: LongInt): Boolean; Inline;     Class Operator GreaterThanOrEqual(Left, Right: LongInt): Boolean; Inline;     Property IP: LongInt Read _GetIP Write _SetIP;     Property IPx[Index: Integer]: Byte Read _GetIPx Write _SetIPx;   End; Function MAKEIPRANGE     (Low, High: BYTE): DWORD;      Inline; Function MAKEIPADDRESS   (B1, B2, B3, B4: BYTE): DWORD; Inline; Function FIRST_IPADDRESS (X: DWORD): BYTE;              Inline; Function SECOND_IPADDRESS(X: DWORD): BYTE;              Inline; Function THIRD_IPADDRESS (X: DWORD): BYTE;              Inline; Function FOURTH_IPADDRESS(X: DWORD): BYTE;              Inline
Delphi-Quellcode:
Procedure TIP._SetIP(IP: LongInt);
  Begin     _IP.L := IP;   End; Function TIP._GetIP: LongInt;   Begin     Result := _IP.L;   End; Procedure TIP._SetIPx(Index: Integer; IPx: Byte);   Begin     _IP.B[3 - Index] := IPx;   End; Function TIP._GetIPx(Index: Integer): Byte;   Begin     Result := _IP.B[3 - Index];   End; Class Operator TIP.Implicit(Value: LongInt): TIP;   Begin     Result._IP.L := Value;   End; Class Operator TIP.Implicit(Value: String): TIP;   Var i, i2, i3, i4: Integer;   Begin     i := 3;     Repeat       i2 := Pos('.', Value) - 1;       If i2 < 0 Then i2 := 99;       Val(Copy(Value, 1, i2), i3, i4);       If i4 <> 0 Then i3 := 0;       Result._IP.B[i] := i3;       Delete(Value, 1, i2 + 1);       Dec(i);     Until i < 0;   End; Class Operator TIP.Implicit(Rec: TIP): LongInt;   Begin     Result := Rec._IP.L;   End; Class Operator TIP.Implicit(Rec: TIP): String;   Var i: Integer;     S: Array[0..3] of String;   Begin     For i := 3 downto 0 do Str(Rec._IP.B[i], S[i]);     Result := S[3] + '.' + S[2] + '.' + S[1] + '.' + S[0];   End; Class Operator TIP.Equal(Left, Right: LongInt): Boolean;   Begin     Result := Left = Right;   End; Class Operator TIP.NotEqual(Left, Right: LongInt): Boolean;   Begin     Result := Left <> Right;   End; Class Operator TIP.LessThanOrEqual(Left, Right: LongInt): Boolean;   Begin     Result := ByteSwap(Left) <= ByteSwap(Right);   End; Class Operator TIP.LessThan(Left, Right: LongInt): Boolean;   Begin     Result := ByteSwap(Left) < ByteSwap(Right);   End; Class Operator TIP.GreaterThan(Left, Right: LongInt): Boolean;   Begin     Result := ByteSwap(Left) > ByteSwap(Right);   End; Class Operator TIP.GreaterThanOrEqual(Left, Right: LongInt): Boolean;   Begin     Result := ByteSwap(Left) >= ByteSwap(Right);   End; Function MAKEIPRANGE(Low, High: BYTE): DWORD;   Begin     Result := (LongInt(High) shl 8) or low;   End; Function MAKEIPADDRESS(B1, B2, B3, B4: BYTE): DWORD;   Begin     Result := ((((((LongInt(B1) shl 8) or B2) shl 8) or B3) shl 8) or B4);   End; Function FIRST_IPADDRESS(X: DWORD): BYTE;   Begin     Result := x shr 24;   End; Function SECOND_IPADDRESS(X: DWORD): BYTE;   Begin     Result := x shr 16;   End; Function THIRD_IPADDRESS(X: DWORD): BYTE;   Begin     Result := x shr 8;   End; Function FOURTH_IPADDRESS(X: DWORD): BYTE;   Begin     Result := x;   End; |
AW: IP-Adresse von String nach Integer wandeln
Vllt eher so:
Delphi-Quellcode:
procedure IpStrToBytes(IPStr: string; var b0: Byte; var b1: Byte; var b2: Byte; var b3: Byte);
var sl: TStringList; begin sl := TStringList.Create; try sl.Delimiter := '.'; sl.DelimitedText := IpStr; //<------ b0 := StrToIntDef(sl[0], 0); b1 := StrToIntDef(sl[1], 0); b2 := StrToIntDef(sl[2], 0); b3 := StrToIntDef(sl[3], 0); finally sl.Free; end; end; |
AW: IP-Adresse von String nach Integer wandeln
Warum so kompliziert? Auch hier kann man die Funktion inet_addr weiter verwenden.
Einen variant packed record nehmen (wie in Himitsus Beispiel schon. Und das Ergebnis von inet_addr dem packed record (DWord) zuweisen. Und die einzelnen Byte Werte des DWords kann man dann über das array[0..3] of Byte abfragen (und notfalls noch auf Integer casten) |
AW: IP-Adresse von String nach Integer wandeln
Zitat:
|
AW: Re: IP-Adresse von String nach Integer wandeln
Zitat:
Ich will zwar jetzt nicht direkt provokativ sein, aber so ein Sche** Blödsinn habe ich schon lange nicht mehr gelesen... [/OT] MfG:thumb: |
AW: IP-Adresse von String nach Integer wandeln
Leider nicht sehr hilfreich dein Beitrag.
|
AW: Re: IP-Adresse von String nach Integer wandeln
Zitat:
Kein Wunder, der Beitrag den du da kommentierst ist aus 2006. Ist das nicht schon Leichenfledderei? :stupid: [/CompleteOT] |
AW: IP-Adresse von String nach Integer wandeln
Lösung gefunden. Man muss erst den Delimiter setzen und dann den Delimitertext.
|
AW: IP-Adresse von String nach Integer wandeln
Zitat:
Grüße Klaus |
AW: IP-Adresse von String nach Integer wandeln
Zitat:
DelimitedText ist ein property und wird über einen Setter dann in die eigentliche StringList geladen. Und zu diesem Zeitpunkt muss der Delimiter bekannt sein ;) |
AW: IP-Adresse von String nach Integer wandeln
Maybe you can use
![]() |
AW: IP-Adresse von String nach Integer wandeln
Und was macht ihr, wenn es plötzlich eine IPv6-Adresse ist? :wink:
|
AW: IP-Adresse von String nach Integer wandeln
Thanks, but the Stringlist works fine.
|
AW: IP-Adresse von String nach Integer wandeln
Zitat:
Greetz alcaeus |
AW: IP-Adresse von String nach Integer wandeln
Es ist eben erst mal nur für IPv4 ausgelegt.
|
AW: IP-Adresse von String nach Integer wandeln
Wäre aber auch kein Problem das umzusetzen, denn eine IPv6 ist
a) länger als IPv4 b) hat statt dem . einen : als Trenner Somit kann man ganz einfach überprüfen, ob es IPv4 oder IPv6 ist und entsprechend eine andere Struktur zurückliefern |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz