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?
 nicht angemeldet
 nicht angemeldet TS
 TS mermshaus
 mermshaus Rolf b
 Rolf b Auge
 Auge Matthias Apsel
 Matthias Apsel Der Martin
 Der Martin