php - 如何在 PHP 中计算我的广播地址?
问题描述
我正在尝试使用按位运算符来计算使用 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
以获取通配符掩码,然后| OR
与 IP 地址交换:
$broadcast = long2ip(ip2long($ipv4) | ~ip2long($subnet_mask));
对于网络,只需& AND
IP 地址和子网掩码:
$network = long2ip(ip2long($ipv4) & ip2long($subnet_mask));
推荐阅读
- windows - 自动运行 Delphi 程序在 C:\windows\system32 中运行
- python - tkinter:如何使用一个垂直滚动条滚动两个画布?
- oracle - 无法在 APEX 上启用 JavaScript MLE
- python-3.x - 如何从Python(3.9)中的字符串中提取特定字母之间的文本?
- r - 在 r 中使用 ifelse 具有相同代码的不同结果
- python - 获取张量张量流中的整数值
- javascript - HTML5 视频在播放时没有缓冲足够的数据
- spring - Spring Data Neo4j 关系无法正常工作
- discord - 在斜杠命令回复 discors.js BOT 中提及角色
- javascript - 如何在 mongodb 数据库或所有项目中查找特定项目?