gpt4 book ai didi

php - 如何获取子网中的每个IP地址?

转载 作者:行者123 更新时间:2023-12-05 02:22:48 25 4
gpt4 key购买 nike

所以下面的代码是另一位用户不久前发布的。

我想知道在 "net['firstip']net['lastip']" 之间获取每个 IP 地址的最佳方法是什么?

我尝试了几种从十进制转换为二进制的方法,但没有用。我的想法是 for() 增加二进制 firstip 直到它到达 lastip,然后将每一步转换为十进制等效于放入新数组。

感谢所有帮助。我将 *** 放在我试图找到 IP 之间的两个特定部分。

function zerofill($val,$len,$reverse = false){
while(strlen($val)<$len)
if($reverse)
$val .= "0";
else
$val = "0".$val;
return $val;

}


function hextoip($hex){
for($i=0;$i<4;$i++)
@$ip .= base_convert(substr($hex,$i*2,2),16,10).".";
$ip = substr($ip,0,-1);
return $ip;
}



function iptohex($ip){
$iparr = explode(".",$ip);
foreach($iparr as $i => $group){
@$hex .= zerofill(base_convert($group,10,16),2);
}
return $hex;
}



function hextobin($hex){
$bin = zerofill(base_convert($hex,16,2),32);
return $bin;
}



function bintohex($bin) {
$hex = zerofill(base_convert($bin,2,16),8);
return $hex;
}



function getnet($ip, $netmask){
$iphex = iptohex($ip);
$netbin = hextobin($iphex);
$maskhex = iptohex($netmask);
$maskbin = hextobin($maskhex);

$hostbits = substr($maskbin,strpos($maskbin,"0"));
$netbits = substr($maskbin,0,strpos($maskbin,"0"));
$nethex = bintohex(zerofill(substr($netbin,0,strlen($netbits)),32,true));

$hosts = pow(2,strlen($hostbits));
$available_hosts = $hosts-3;

$net["ip"] = $ip;
$net["mask"] = $netmask;
$net["network"] = hextoip($nethex);
$net["netstr"] = $net["network"]."/".strlen($netbits);
$net["hosts"] = $available_hosts;
*** $net["firstip"] = hextoip(zerofill(base_convert(base_convert($nethex,16,10)+1,10,16),8));;
*** $net["lastip"] = hextoip(zerofill(base_convert(base_convert($nethex,16,10)+$available_hosts+1,10,16),8));
$net["broadcast"] = hextoip(zerofill(base_convert(base_convert($nethex,16,10)+$available_hosts+2,10,16),8));
return $net;
} `

最佳答案

您可以使用以下代码从第一个IP到最后一个IP获取所有IP:

<?php

function getIpRange( $cidr) {

list($ip, $mask) = explode('/', $cidr);

$maskBinStr =str_repeat("1", $mask ) . str_repeat("0", 32-$mask ); //net mask binary string
$inverseMaskBinStr = str_repeat("0", $mask ) . str_repeat("1", 32-$mask ); //inverse mask

$ipLong = ip2long( $ip );
$ipMaskLong = bindec( $maskBinStr );
$inverseIpMaskLong = bindec( $inverseMaskBinStr );
$netWork = $ipLong & $ipMaskLong;

$start = $netWork+1;//ignore network ID(eg: 192.168.1.0)

$end = ($netWork | $inverseIpMaskLong) -1 ; //ignore brocast IP(eg: 192.168.1.255)
return array('firstIP' => $start, 'lastIP' => $end );
}

function getEachIpInRange ( $cidr) {
$ips = array();
$range = getIpRange($cidr);
for ($ip = $range['firstIP']; $ip <= $range['lastIP']; $ip++) {
$ips[] = long2ip($ip);
}
return $ips;
}

$cidr = '172.16.0.0/27'; // max. 30 ips
print_r(getEachIpInRange ( $cidr));

/* output:
Array
(
[0] => 172.16.0.1
[1] => 172.16.0.2
[2] => 172.16.0.3
...
[27] => 172.16.0.28
[28] => 172.16.0.29
[29] => 172.16.0.30
)
*/

如果您需要更多信息,请在此处查看 PHP 手册:http://php.net/manual/de/function.ip2long.php
我的示例代码中的某些部分来自本手册。

关于php - 如何获取子网中的每个IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27671953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com