我知道我可以通过使用PHP内置函数(如up2long
和long2ip
)将IP地址转换为十进制表示法来轻松完成此操作。我只是希望能够使用标准IP地址表示法作为练习。
我想的问题是这样的:给定一个起始IP地址,比如说192.168.1.100,结束IP地址,比如说201.130.22.10。使程序打印该范围内的所有地址编号(192.168.1.100,192.168.1.101,...,201.130.22.9,201.130.22.10)。
我在考虑可能的方法是在for
条件内建立嵌套的while
循环,直到起始地址的第一个八位字节与结束地址的第一个八位字节匹配。然后为第二个八位字节执行相同的代码块,依此类推,直到程序到达结束地址并完成。
我刚刚开始学习编程,所以很有可能我的思考和编写代码远非优雅。如果你这样做,你会怎么做?
答案 0 :(得分:6)
这样的事情:
<?php
// works only for valid range
$start_ip = '10.0.0.1';
$end_ip = '10.0.20.1';
$start_arr = explode('.',$start_ip);
$end_arr = explode('.',$end_ip);
while($start_arr <= $end_arr)
{
echo implode('.',$start_arr) . '<br>';
$start_arr[3]++;
if($start_arr[3] == 256)
{
$start_arr[3] = 0;
$start_arr[2]++;
if($start_arr[2] == 256)
{
$start_arr[2] = 0;
$start_arr[1]++;
if($start_arr[1] == 256)
{
$start_arr[1] = 0;
$start_arr[0]++;
}
}
}
}
?>
答案 1 :(得分:2)
这不那么复杂了:
<?php
// works only for valid range
$start_ip = ip2long('10.0.0.1');
$end_ip = ip2long('10.0.20.1');
while($start_ip <= $end_ip){
echo long2ip($start_ip).'<br>';
$start_ip++;
}
?>
答案 2 :(得分:0)
function getInBetweenIPs($startIP,$endIP){
$subIPS = array();
$start_ip = ip2long($startIP);
$end_ip = ip2long($endIP);
while($start_ip <= $end_ip){
$subIPS[]=long2ip($start_ip);
$start_ip++;
}
return $subIPS;
}
答案 3 :(得分:0)
增加(添加到):
exports.addFile = async (req, res) => {
try {
console.log(req.body)
return res.status(200).send({
message: "Ok"
})
} catch (e) {
return res.status(500).send({
message: e.message
})
}
减量(取自):
<?php
function ipinc($i): string {
$i = explode(".", $i);
$a = $i[0];
$b = $i[1];
$c = $i[2];
$d = $i[3];
$d++;
if ($d > 255) {
$d = 0;
$c++;
}
if ($c > 255) {
$c = 0;
$b++;
}
if ($b > 255) {
$b = 0;
$a++;
}
if ($a > 255) {
die("IPv4 Range Exceeded");
}
return "$a.$b.$c.$d";
}
?>
要测试这两个功能,可以编写一个for循环来回生成大约1600万个IP地址,可以将输出通过管道传输到文件并以这种方式存储结果。
<?php
function ipdec($i) {
$i = explode(".", $i);
$a = $i[0];
$b = $i[1];
$c = $i[2];
$d = $i[3];
$d--;
if ($d < 0) {
$d = 255;
$c--;
}
if ($c < 0) {
$c = 255;
$b--;
}
if ($b < 0) {
$b = 255;
$a--;
}
if ($a < 0) {
die("IPv4 Range Exceeded");
}
return "$a.$b.$c.$d";
}
?>
如果您不喜欢通过变量声明分配值,请修改函数,以便可以使用pass by reference。