How can I calculate my Broadcast Address in PHP?
I am trying to use bitwise operators to work out the broadcast address using PHP. I am facing an issue when using the ~
(NOT) operator to invert the subnet mask as it returns in string format.
// Derive from inputs normally
$ipv4 = '130.45.34.36';
$subnet_mask = '255.255.240.0';
$network = (object) [
'ipv4' => explode('.', $ipv4),
'subnet_mask' => explode('.', $subnet_mask)
];
$broadcast = [];
$net_address = [];
for($i = 0; $i <= count($network->ipv4) -1; $i++)
$broadcast[$i] = ($net_address[] = (float) $network->ipv4[$i] & (float) $network->subnet_mask[$i])
| ((int) ~$network->subnet_mask[$i]) +256;
printf("Network Address: %s\n", implode('.', $net_address)); // 130.45.32.0 (Expected)
printf("Broadcast Address: %s", implode('.', $broadcast)); // 386.301.288.256 (Unexpected)
Since ~$network->subnet_mask[$i]
returns a string, I've tired to cast it first to an (int)
which has caused the unexpected result - without this cast, I get a string + int
conversion error. I assume I need a different datatype, any help appreciated. My expected Broadcast Address is: 130.45.47.255
.
EDIT #1: I have tried to use (float)
casts, which resulted in the same output.
Answer
Solution:
Use the conversion functions to perform bitwise operations on long integers and then convert back to IP and you don't need all the exploding, looping etc.
Swap the bits that are set/not set in the subnet mask with ~ NOT
to get the wildcard mask and then | OR
that with the IP address:
$broadcast = long2ip(ip2long($ipv4) | ~ip2long($subnet_mask));
For the network just & AND
the IP address and subnet mask:
$network = long2ip(ip2long($ipv4) & ip2long($subnet_mask));
Source