Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IP-Adresse von String nach Integer wandeln (https://www.delphipraxis.net/70577-ip-adresse-von-string-nach-integer-wandeln.html)

FrankBrin 1. Jun 2006 10:09


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:

marabu 1. Jun 2006 10:12

Re: IP-Adresse von String nach Integer wandeln
 
Hallo Frank,

hier mein Vorschlag - nebst Diskussion: klick

Grüße vom marabu

FrankBrin 1. Jun 2006 10:16

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!

EDatabaseError 1. Jun 2006 10:18

Re: IP-Adresse von String nach Integer wandeln
 
Unterteil den String an den Punkten in 4 Strings:
explodeexplode

diese Strings wandelst du mit StrToInt um undfertig.


Mfg
Tobi

Evian 1. Jun 2006 10:22

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?

marabu 1. Jun 2006 10:29

Re: IP-Adresse von String nach Integer wandeln
 
Zitat:

Zitat von FrankBrin
Hallo,
diesen Beitrag hab ich bereits gesichtet. Doch da wird immer nur von Int > Str gewandelt.
Ich brauchs umgedreht!

Du hast wohl mehr die Diskussion betrachtet, weniger den von mir verlinkten Beitrag:

Zitat:

Zitat von marabu
Kennt denn keiner mehr die Standard-Routinen inet_addr() und inet_ntoa() aus der Unit WinSock?

inet_addr() scheint mir genau dein Problem zu lösen.

marabu

FrankBrin 1. Jun 2006 10:35

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

Luckie 13. Sep 2010 15:24

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.

mkinzler 13. Sep 2010 15:28

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);
...

Luckie 13. Sep 2010 15:37

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:
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;
Da bekomme ich bei b1 ein "Listenindex überschreitet das Maximum". Der Ip-String ist aber korrekt: "192.168.2.102".

Was mache ich da noch falsch?

himitsu 13. Sep 2010 15:52

AW: IP-Adresse von String nach Integer wandeln
 
siehe
Delphi-Quellcode:
Class Operator Implicit(Value: String): TIP;
läßt sich über PosEx bestimmt noch optimieren

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;
&#160; &#160; &#160; If i2 < 0 Then i2 := 99;
&#160; &#160; &#160; Val(Copy(Value, 1, i2), i3, i4);
&#160; &#160; &#160; If i4 <> 0 Then i3 := 0;
&#160; &#160; &#160; Result._IP.B[i] := i3;
&#160; &#160; &#160; Delete(Value, 1, i2 + 1);
&#160; &#160; &#160; Dec(i);
&#160; &#160; Until i < 0;
&#160; End;

Class Operator TIP.Implicit(Rec: TIP): LongInt;
&#160; Begin
&#160; &#160; Result := Rec._IP.L;
&#160; End;

Class Operator TIP.Implicit(Rec: TIP): String;
&#160; Var i: Integer;
&#160; &#160; S: Array[0..3] of String;

&#160; Begin
&#160; &#160; For i := 3 downto 0 do Str(Rec._IP.B[i], S[i]);
&#160; &#160; Result := S[3] + '.' + S[2] + '.' + S[1] + '.' + S[0];
&#160; End;

Class Operator TIP.Equal(Left, Right: LongInt): Boolean;
&#160; Begin
&#160; &#160; Result := Left = Right;
&#160; End;

Class Operator TIP.NotEqual(Left, Right: LongInt): Boolean;
&#160; Begin
&#160; &#160; Result := Left <> Right;
&#160; End;

Class Operator TIP.LessThanOrEqual(Left, Right: LongInt): Boolean;
&#160; Begin
&#160; &#160; Result := ByteSwap(Left) <= ByteSwap(Right);
&#160; End;

Class Operator TIP.LessThan(Left, Right: LongInt): Boolean;
&#160; Begin
&#160; &#160; Result := ByteSwap(Left) < ByteSwap(Right);
&#160; End;

Class Operator TIP.GreaterThan(Left, Right: LongInt): Boolean;
&#160; Begin
&#160; &#160; Result := ByteSwap(Left) > ByteSwap(Right);
&#160; End;

Class Operator TIP.GreaterThanOrEqual(Left, Right: LongInt): Boolean;
&#160; Begin
&#160; &#160; Result := ByteSwap(Left) >= ByteSwap(Right);
&#160; End;

Function MAKEIPRANGE(Low, High: BYTE): DWORD;
&#160; Begin
&#160; &#160; Result := (LongInt(High) shl 8) or low;
&#160; End;

Function MAKEIPADDRESS(B1, B2, B3, B4: BYTE): DWORD;
&#160; Begin
&#160; &#160; Result := ((((((LongInt(B1) shl 8) or B2) shl 8) or B3) shl 8) or B4);
&#160; End;

Function FIRST_IPADDRESS(X: DWORD): BYTE;
&#160; Begin
&#160; &#160; Result := x shr 24;
&#160; End;

Function SECOND_IPADDRESS(X: DWORD): BYTE;
&#160; Begin
&#160; &#160; Result := x shr 16;
&#160; End;

Function THIRD_IPADDRESS(X: DWORD): BYTE;
&#160; Begin
&#160; &#160; Result := x shr 8;
&#160; End;

Function FOURTH_IPADDRESS(X: DWORD): BYTE;
&#160; Begin
&#160; &#160; Result := x;
&#160; End;

XHelp 13. Sep 2010 15:54

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;

SirThornberry 13. Sep 2010 16:04

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)

Luckie 13. Sep 2010 16:16

AW: IP-Adresse von String nach Integer wandeln
 
Zitat:

Zitat von XHelp (Beitrag 1049315)
Vllt eher so:

Ändert leider nichts an der Fehlermeldung.

Aphton 13. Sep 2010 16:25

AW: Re: IP-Adresse von String nach Integer wandeln
 
Zitat:

Zitat von Evian (Beitrag 475801)
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?

[OT]
Ich will zwar jetzt nicht direkt provokativ sein, aber so ein Sche** Blödsinn habe ich schon lange nicht mehr gelesen...
[/OT]

MfG:thumb:

Luckie 13. Sep 2010 16:26

AW: IP-Adresse von String nach Integer wandeln
 
Leider nicht sehr hilfreich dein Beitrag.

Sir Rufo 13. Sep 2010 16:30

AW: Re: IP-Adresse von String nach Integer wandeln
 
Zitat:

Zitat von Aphton (Beitrag 1049329)
Zitat:

Zitat von Evian (Beitrag 475801)
...

[OT]
Ich will zwar jetzt nicht direkt provokativ sein, aber so ein Sche** Blödsinn habe ich schon lange nicht mehr gelesen...
[/OT]

MfG:thumb:

[Complete OT]
Kein Wunder, der Beitrag den du da kommentierst ist aus 2006.
Ist das nicht schon Leichenfledderei? :stupid:
[/CompleteOT]

Luckie 13. Sep 2010 16:37

AW: IP-Adresse von String nach Integer wandeln
 
Lösung gefunden. Man muss erst den Delimiter setzen und dann den Delimitertext.

Klaus01 13. Sep 2010 16:46

AW: IP-Adresse von String nach Integer wandeln
 
Zitat:

Zitat von Luckie (Beitrag 1049334)
Lösung gefunden. Man muss erst den Delimiter setzen und dann den Delimitertext.

siehe auch Beitrag #12

Grüße
Klaus

Sir Rufo 13. Sep 2010 16:48

AW: IP-Adresse von String nach Integer wandeln
 
Zitat:

Zitat von Luckie (Beitrag 1049334)
Lösung gefunden. Man muss erst den Delimiter setzen und dann den Delimitertext.

Wie denn auch sonst? :mrgreen:
DelimitedText ist ein property und wird über einen Setter dann in die eigentliche StringList geladen.
Und zu diesem Zeitpunkt muss der Delimiter bekannt sein ;)

Remko 13. Sep 2010 20:31

AW: IP-Adresse von String nach Integer wandeln
 
Maybe you can use WSAStringToAddress ?

implementation 13. Sep 2010 20:33

AW: IP-Adresse von String nach Integer wandeln
 
Und was macht ihr, wenn es plötzlich eine IPv6-Adresse ist? :wink:

Luckie 13. Sep 2010 20:37

AW: IP-Adresse von String nach Integer wandeln
 
Thanks, but the Stringlist works fine.

alcaeus 14. Sep 2010 06:33

AW: IP-Adresse von String nach Integer wandeln
 
Zitat:

Zitat von implementation (Beitrag 1049386)
Und was macht ihr, wenn es plötzlich eine IPv6-Adresse ist? :wink:

Das was die meisten modernen Anwendungen machen wenn ne IPv6 daher kommt: ganz dezent und diskret.....crashen :mrgreen:

Greetz
alcaeus

Luckie 14. Sep 2010 08:29

AW: IP-Adresse von String nach Integer wandeln
 
Es ist eben erst mal nur für IPv4 ausgelegt.

Sir Rufo 14. Sep 2010 09:04

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