AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IP-Adresse von String nach Integer wandeln
Thema durchsuchen
Ansicht
Themen-Optionen

IP-Adresse von String nach Integer wandeln

Ein Thema von FrankBrin · begonnen am 1. Jun 2006 · letzter Beitrag vom 14. Sep 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#11

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 15:52
siehe 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;
      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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Sep 2010 um 15:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von XHelp
XHelp

Registriert seit: 12. Jul 2004
Ort: Duisburg
172 Beiträge
 
Delphi 6 Enterprise
 
#12

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 15:54
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;
Alex
Von allen Dingen die mir verloren gegangen,
hab ich am meisten an meinem Verstand gehangen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 16:04
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 16:16
Vllt eher so:
Ändert leider nichts an der Fehlermeldung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#15

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

  Alt 13. Sep 2010, 16:25
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 16:26
Leider nicht sehr hilfreich dein Beitrag.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

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

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

MfG
[Complete OT]
Kein Wunder, der Beitrag den du da kommentierst ist aus 2006.
Ist das nicht schon Leichenfledderei?
[/CompleteOT]
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#18

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 16:37
Lösung gefunden. Man muss erst den Delimiter setzen und dann den Delimitertext.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 16:46
Lösung gefunden. Man muss erst den Delimiter setzen und dann den Delimitertext.
siehe auch Beitrag #12

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#20

AW: IP-Adresse von String nach Integer wandeln

  Alt 13. Sep 2010, 16:48
Lösung gefunden. Man muss erst den Delimiter setzen und dann den Delimitertext.
Wie denn auch sonst?
DelimitedText ist ein property und wird über einen Setter dann in die eigentliche StringList geladen.
Und zu diesem Zeitpunkt muss der Delimiter bekannt sein
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz