phpbar.de logo

Mailinglisten-Archive

[php] 32-Bit Integer-Zahl ohne Vorzeichen

[php] 32-Bit Integer-Zahl ohne Vorzeichen

Stefan Engelhardt Stefan.Engelhardt_(at)_stud.fh-hannover.de
Sun, 16 Apr 2000 23:26:49 +0200


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