Hallo Rolf b,
Wenn Du auf Schieberei verzichtest und lediglich die Bit-Operatoren verwendest (& | und ~), ist alles gut. Wie Du mit 32-bit Integers aus der Präfixlänge eine Subnetzmaske machst, habe ich oben beschrieben (-pow(2, 32-$prefixlaenge)).
Scheint mit pow() auch nicht zu funktionieren, da bei ip2long() und long2ip() scheinbar ein Fehler mit einem anderen ausgeglichen wird ... Aber mit
$netmask = 0xFFFFFFFF << (32 -$cidr);
scheint es wirklich zu funktionieren. Ich teste gerade noch.
Und dann willst Du irre langsames und kompliziertes Zeug machen?
Da hast Du:
<?php
$netmask = 0xFFFFFFFF;
var_dump($netmask); ### float(4294967295)
$netmask = ip2long('255.255.255.255');
var_dump($netmask); ### int(-1)
$netmask = sprintf('%u', ip2long('255.255.255.255'));
var_dump($netmask); ### string(10) "4294967295"
$netmask = 1 * $netmask;# implizite Typumwandlung durch Rechenoperation
var_dump($netmask); ### float(4294967295)
Hinter den Ausgaben stehen die Ausgaben, die auf einem 32-Bit-System kommen. Auf 64-Bit-Systemen kommt:
int(4294967295)
int(4294967295)
string(10) "4294967295"
int(4294967295)
Wie auch immer. Hier steht alles, was Du brauchst ... Den Rahmen für den Check mehrerer IPs und andere Ausgaben kannst Du ja selbst machen. Oder ist das zu einfach?