Cardinal Zahlen StrToInt

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Cardinal Zahlen StrToInt

Beitrag von KOBOLD Messring GmbH »

Habe folgendes Problem:
IP-Adressen - numerisch ausgedrückt - liegen zwischen 0 und 4,294,967,295.
wäre also - gemäss Freepascal Wiki - ein Fall für Datentyp CARDINAL.
Wenn ich aber die Eingabe aus einem Editfeld konvertieren möchte, etwa so:

VAR n : Cardinal;
BEGIN
n := StrToInt (Edit1.Text);

Dann gibt es: TApplication.HandleException "3900800100" is an invalid integer.

Eine andere Konvertierfunktion - etwa StrToInt64 von Delphi - habe ich bei unserem Lazarus nicht gefunden.
¿Was kann ich da tun? ¿Wie konvertiere ich Zahlen grösser 2,147,483,647 von String_To_Cardinal?

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Antrepolit »

IP Adressen Numerisch?

Die einzelnen Bytes gehen von 0-255? meinst du IPv4 oder IPv6?
Ne IP-Adresse sieht z. B. so aus: 192.168.245.234

Kein Zahl geht über 255. Die Punkte dienen als Trennzeichen. Das nimmt man auch nicht
als Cardinal, das macht gerade gar keinen Sinn. Stattdessen würde ich nach wie vor
4 bzw. 6 Bytes für eine IP nehmen, und diese evtl. in einem Typ definieren.

Aber es kann natürlich sein, dass ich dein Problem nicht verstehe.
Grüße, Antrepolit

care only if your os is really burning

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Beitrag von bembulak »

http://www.freepascal.org/docs-html/pro ... 750008.2.1" onclick="window.open(this.href);return false;

Demnach wäre "longword" das Passende, oder irre ich mich?
Geht von 0...4294967295

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Beitrag von KOBOLD Messring GmbH »

Mein Problem ist folgendes:
ich habe eine Datenbank (von ip2location.com), welche IP-Adressen (ipv4) numerisch beeinhaltet, also statt z.B. 80.148.53.18 schreiben die da: 1351890194
Also eine IP-Adresse, z.B. IPv4 = a.b.c.d
ist umzuwandeln in:
numerisch_IP = a*16777216 +b*65536 + c*256 + d
damit ich dies mit den Datenbankeinträgen vergleichen kann.
UMGEKEHRT muss ich aber auch - zur Ansicht - den numerischen Eintrag wieder in die gewohnte a.b.c.d Darstellung umwandeln, ¡und da ist das Problem!
Wenn z.B. numerisch_IP= 3900800700 ist, dann bin ich über MaxInt und die Funktion StrToInt steigt aus.
¿Gibt es denn nicht eine StrToCardinal oder StrToInt64 wie beim Delphi?
Im Moment habe ich mir so geholfen: (Damit gewinn ich bestimmt den Preis für den umständlichsten und verknorzesten Code, jejejej)

Code: Alles auswählen

VAR n, 
    n1,
    n2 : Cardinal;
    s,
    s1,
    s2 : String;
BEGIN
  s := Edit1.Text;
  IF Length (s) > 9
    THEN Begin
           s1 := Copy (s, Length (s) - 8, 9);
           s2 := Copy (s, 1, Length (s) - 9);
           n1 := StrToInt (s1);
           n2 := StrToInt (s2);
           n := (n2 * 1000000000) + n1;
         End
    ELSE n := StrToInt (Edit1.Text);
(Nochmals zur Verdeutlichung: mein Problem ist es nicht, numerische Datenbankeinträge zu vergleichen, sondern liegt in einem kleinen Hilfsprogrämmchen, mit dem ich händisch mal eben eine lange Zahl eintippen kann (zuweilen grösser als MaxInt) und welches mir dann die gewohnte Darstellung als a.b.c.d liefert - mit der ich wiederum meine php-Webprogrammierung gegen die o.g. Datenbank testen kann...)
¡¡¡ VIELEN DANK AN ALLE FÜR DAS INTERESSE an sooo kleinen Sachen wie ein StrToInt !!!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6771
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

StrToInt64 ist die Version für große Zahlen (Int64).

Ich habe keine Überladung von StrToInt für LongWord gefunden.

Wobei es lt. Referenzmanual vom Compilermodus abhängig ist, wie zb. Cardinal oder Integer behandelt werden (2, 4 oder 8 Bytes).

Zusätzlich ist die Frage da, warum die IPAdressen numerisch gespeichert werden müssen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Beitrag von KOBOLD Messring GmbH »

Hola af0815,
danke für Deine Antwort. Ich habe jetzt zur Sicherheit LongWord genommen (wegen Unabhängigkeit vom Compilermodus oder OS).
An der Representation der IP-Adressen kann ich nichts ändern, die kommen so aus der Datenbank von ip2location.com (sind 2.800.000 Datensätze, die kann man auch nicht mal so schnell umschreiben).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6771
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

KOBOLD Messring GmbH hat geschrieben:Ich habe jetzt zur Sicherheit LongWord genommen (wegen Unabhängigkeit vom Compilermodus oder OS)
Die komplett sichere Seite ist Int64, da dir da auch das Vorzeichen dann egal ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

[quote="
¿Gibt es denn nicht eine StrToCardinal oder StrToInt64 wie beim Delphi?[/quote]

Bin mir ziemlich sicher, dass StrToInt64 auch mit Lazarus funktioniert.

Euklid

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

FormatStr,

ist die geeignete Prozedur für sowas, die nimmt einen Zeiger auf die zu wandelnde Zahl an und bedient das über Variant.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Er will doch einen String in eine Binärdarstellung umwandeln und nicht umgedreht wie kann dafür FormatStr in Frage kommen?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten