首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 計算網段起始與結束 IP 地址完整實現

     編輯:PHP 綜合知識

網段計算原理

給定 CIDR 表示法(如 `192.168.1.5/24`),核心步驟:

  1. 子網掩碼:前 24 位為 1,後 8 位為 0 → `255.255.255.0`
  2. 網絡地址(起始 IP):IP 與掩碼做「與」運算
  3. 廣播地址(結束 IP):IP 與掩碼取反後做「或」運算
  4. 可用主機範圍:網絡地址+1 至 廣播地址-1

核心函數實現

// 掩碼位數轉二進制字符串
function mask2bin($n) {
    $n = intval($n);
    if ($n < 0 || $n > 32) die('error submask');
    return str_repeat("1", $n) . str_repeat("0", 32 - $n);
}

// 二進制取反
function revBin($s) {
    return str_replace(['0','1','2'], ['2','0','1'], $s);
}

// 計算網段起始 IP(單字節)
function startIp($str, $bSub) {
    $bIp = str_pad(decbin($str), 8, "0", STR_PAD_LEFT);
    return bindec($bIp & $bSub);
}

// 計算網段結束 IP(單字節)
function endIp($str, $bSub) {
    $bIp = str_pad(decbin($str), 8, "0", STR_PAD_LEFT);
    return bindec($bIp | revBin($bSub));
}

完整調用示例

$ip = ['192', '168', '1', '5'];
$mask = '24';
$bSub = mask2bin($mask);

// 掩碼分段
$maskArr = [
    substr($bSub, 0, 8),
    substr($bSub, 8, 8),
    substr($bSub, 16, 8),
    substr($bSub, 24, 8)
];

// 輸出結果
echo "掩碼: " . implode('.', array_map('bindec', $maskArr)) . "\n";
echo "網絡地址: ";
for ($i=0;$i<4;$i++) echo startIp($ip[$i], $maskArr[$i]) . ($i!=3?'.':'');
echo "\n首個可用: ";
for ($i=0;$i<3;$i++) echo startIp($ip[$i], $maskArr[$i]) . '.';
echo (startIp($ip[3], $maskArr[3]) + 1) . "\n";
echo "最後可用: ";
for ($i=0;$i<3;$i++) echo endIp($ip[$i], $maskArr[$i]) . '.';
echo (endIp($ip[3], $maskArr[3]) - 1) . "\n";
echo "廣播地址: " . implode('.', array_map(fn($i)=>endIp($ip[$i], $maskArr[$i]), range(0,3)));

現代化改進建議

PHP 7.0+ 可使用 `ip2long`/`long2ip` 簡化運算,或直接引入 `myclabs/php-ip` 等成熟庫處理 IPv4/IPv6 統一計算。

總結

掌握位運算與 CIDR 核心邏輯,即可靈活實現 IP 範圍計算、子網劃分、防火牆規則生成等網絡編程任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved