Mailinglisten-Archive |
Hallo ihr lieben Listenleser, ich habe ein Problem mit großen Integerzahlen. Ich möchte eine IP-Adresse in eine 32-Bit-Integerzahl umwandeln. Allerdings sind mir da ein paar Ungereimtheiten aufgefallen. Hier erst mal die von mir gebastelten Funktionen. // *** Übergeben wird die IP-Adresse als String. Die Funktion verarbeitet auch Leerzeicehn am Beginn/Ende des Strings. // *** Als Rückgabewert gibt die Funktion die IP-Adresse als 32-Bit-Integer zurück function IPToDec($IPAdresse) { $IPAdresse=trim($IPAdresse); $IPBytes=explode('.',$IPAdresse); $IPDec=((((($IPBytes[0]*256)+$IPBytes[1])*256)+$IPBytes[2])*256)+$IPByte s[3]; return $IPDec; } // *** Übergeben wird die IP-Adresse als 32-Bit-Integer *** // *** Zurückgegeben wird die IP-Adresse in der üblichen Schreibweise als String *** function DecToIP($IPDec) { $IPAdresse=''; for ($i=0;$i<=3;$i++) { $Rest=$IPDec % 256; $IPDec=floor($IPDec / 256); $IPAdresse=$Rest.'.'.$IPAdresse; } return $IPAdresse; } Die Umwandlung in einen 32-Bit-Wert habe ich vorher mit dem Shift-Left-Operator "<<8" gemacht, was ja einer Multiplikation gleichkommt. Das wollte ich aus Performancegründen so machen, weil ich sehr viele Umwandlungen in kurzer Zeit machen muß. Am Rande: Ist das eigentlich von der Theorie schneller als eine Multiplikation mit 256? Dabei habe ich jedoch eine negative Zahl herausbekommen, sobald die Zahl einen bestimmten Wert 2hoch31 überschreitet. Ich folgere daraus, daß die Integerwerte als 32-Bit vorzeichenbehaftet behandelt werden. 1. Frage: Wie kann ich erreichen, daß die Zahl als vorzeichenlos behandelt wird, damit ich meine Shift-Operatoren einsetzen kann? Bzw. gibt es einen Datentyp, der mehr als 32 Bit als Integer verarbeitet? Muß es geben, denn wenn man einer Variablen größere Wert zuweist, kann man die auch korrekt ausgeben. Außerdem klappt es ja auch mit der Multiplikation!?! 2. Frage: Bei meiner Modulo-Division "% 256" kommt als Rest bei Zahlen größer als 2hoch31 eine negative Zahl heraus, egal, was ich anstelle. Ist das vielleicht ein Bug, oder wenn nicht, wie kann ich das abstellen? 3. Frage: Gibt es eine Stelle, wo die Wertebereiche der einzelnen Typen beschrieben sind? Ich habe das Manual und 2 Bücher gewälzt, aber nix gefunden. Ich wäre Euch überaus dankbar, wenn ihr mir auf die Sprünge helfen würdet. Gruß aus Hannover Stefan
php::bar PHP Wiki - Listenarchive