Cardinal Zahlen StrToInt
-
- 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
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?
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?
-
- 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:
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.
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
care only if your os is really burning
-
- 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
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
Demnach wäre "longword" das Passende, oder irre ich mich?
Geht von 0...4294967295
-
- 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:
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)
(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 !!!
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);
¡¡¡ VIELEN DANK AN ALLE FÜR DAS INTERESSE an sooo kleinen Sachen wie ein StrToInt !!!
- 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:
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.
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).
-
- 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:
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).
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).
- 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:
Die komplett sichere Seite ist Int64, da dir da auch das Vorzeichen dann egal ist.KOBOLD Messring GmbH hat geschrieben:Ich habe jetzt zur Sicherheit LongWord genommen (wegen Unabhängigkeit vom Compilermodus oder OS)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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