首页 > 解决方案 > 如何在 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)强制转换,这导致了相同的输出。

标签: php

解决方案


使用转换函数对长整数执行按位运算,然后转换回 IP,您不需要所有的爆炸、循环等。

交换在子网掩码中设置/未设置的位~ NOT以获取通配符掩码,然后| OR与 IP 地址交换:

$broadcast = long2ip(ip2long($ipv4) | ~ip2long($subnet_mask));

对于网络,只需& ANDIP 地址和子网掩码:

$network = long2ip(ip2long($ipv4) & ip2long($subnet_mask));

推荐阅读