作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用按位运算符通过 PHP 计算出广播地址。我在使用 ~
(NOT) 运算符反转子网掩码时遇到问题,因为它以字符串格式返回。
// 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)
由于 ~$network->subnet_mask[$i]
返回一个字符串,我已经厌倦了先将它转换为 (int)
这导致了意外结果 - 没有这个转换,我得到一个 string + int
转换错误。我假设我需要不同的数据类型,感谢任何帮助。我期望的广播地址是:130.45.47.255
。
编辑 #1:我尝试使用 (float)
转换,结果相同。
最佳答案
使用转换函数对长整数执行按位运算,然后转换回 IP,您不需要所有的分解、循环等。
用~ NOT
交换子网掩码中已设置/未设置的位以获得通配符掩码,然后是|或者
IP 地址:
$broadcast = long2ip(ip2long($ipv4) | ~ip2long($subnet_mask));
对于网络,只需& AND
IP 地址和子网掩码:
$network = long2ip(ip2long($ipv4) & ip2long($subnet_mask));
关于php - 如何用 PHP 计算我的广播地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67654254/
我是一名优秀的程序员,十分优秀!