찾다
백엔드 개발PHP 튜토리얼PHP 如何实现ip2cidr(生成多个cidr)

各位大神有没有生成多个cidr的函数  例如1.120.0.0 1.159.255.255    生成 1.120.0.0/13   1.128.0.0/11


回复讨论(解决方案)

function ip2cidr($ip_start,$ip_end) {
if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return NULL; 
$ipl_start=(int)ip2long($ip_start);
$ipl_end=(int)ip2long($ip_end);
if($ipl_start>0 && $ipl_end else $delta=$ipl_end-$ipl_start;
$netmask=str_pad(decbin($delta),32,"0","STR_PAD_LEFT");
if(ip2long($ip_start)==0 && substr_count($netmask,"1")==32) return "0.0.0.0/0";
if($delta0 && $delta%2==0)) return NULL;
for($mask=0;$mask if(substr_count($netmask,"0")!=$mask) return NULL;
return "$ip_start/$mask";
}  这个函数不能生成多个cidr

echo ip2cidr('1.120.0.0', '1.127.255.255'); //1.120.0.0/13function ip2cidr($ip_start,$ip_end) {  if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return NULL;   $ipl_start = ip2long($ip_start);  $ipl_end = ip2long($ip_end);  if($ipl_start>0 && $ipl_end<0) $delta = ($ipl_end + 4294967296) - $ipl_start;  else $delta = $ipl_end - $ipl_start;  $netmask = str_pad(decbin($delta), 32, "0", STR_PAD_LEFT);  if(ip2long($ip_start)==0 && substr_count($netmask,"1")==32) return "0.0.0.0/0";  if($delta<0 or ($delta>0 && $delta%2==0)) return NULL;  for($mask=0; $mask<32; $mask++) if($netmask[$mask]==1) break;  if(substr_count($netmask,"0")!=$mask) return NULL;  return "$ip_start/$mask";} 

echo ip2cidr('1.120.0.0', '1.127.255.255'); //1.120.0.0/13function ip2cidr($ip_start,$ip_end) {  if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return NULL;   $ipl_start = ip2long($ip_start);  $ipl_end = ip2long($ip_end);  if($ipl_start>0 && $ipl_end<0) $delta = ($ipl_end + 4294967296) - $ipl_start;  else $delta = $ipl_end - $ipl_start;  $netmask = str_pad(decbin($delta), 32, "0", STR_PAD_LEFT);  if(ip2long($ip_start)==0 && substr_count($netmask,"1")==32) return "0.0.0.0/0";  if($delta<0 or ($delta>0 && $delta%2==0)) return NULL;  for($mask=0; $mask<32; $mask++) if($netmask[$mask]==1) break;  if(substr_count($netmask,"0")!=$mask) return NULL;  return "$ip_start/$mask";} 


版主大人 您写的和我2楼一样 解决不了1.120.0.0 1.159.255.255 这个IP区间 生成CIDR的问题

虽然拆分并不是很困难,但你如何确定拆分点呢?
比如
echo ip2cidr('1.120.0.0', '1.127.255.255'); //1.120.0.0/13
echo ip2cidr('1.128.0.0', '1.159.255.255'); //1.128.0.0/11
是一种拆法
echo ip2cidr('1.120.0.0', '1.151.255.255'); //1.120.0.0/11
echo ip2cidr('1.152.0.0', '1.159.255.255'); //1.152.0.0/13
又是一种拆法


echo ip2cidr('1.120.0.0', '1.159.255.255');
失败的原因是掩码为
00000000001001111111111111111111
其实本身并没有错,只是不能 cidr 表示而已

注意到
echo long2ip(bindec('111111111111111111111')+ip2long('1.120.0.0')); //1.151.255.255
所以那个第二种拆法是可以机器实现的,而第一种似只能手工实现

虽然拆分并不是很困难,但你如何确定拆分点呢?
比如
echo ip2cidr('1.120.0.0', '1.127.255.255'); //1.120.0.0/13
echo ip2cidr('1.128.0.0', '1.159.255.255'); //1.128.0.0/11
是一种拆法
echo ip2cidr('1.120.0.0', '1.151.255.255'); //1.120.0.0/11
echo ip2cidr('1.152.0.0', '1.159.255.255'); //1.152.0.0/13
又是一种拆法


echo ip2cidr('1.120.0.0', '1.159.255.255');
失败的原因是掩码为
00000000001001111111111111111111
其实本身并没有错,只是不能 cidr 表示而已

注意到
echo long2ip(bindec('111111111111111111111')+ip2long('1.120.0.0')); //1.151.255.255
所以那个第二种拆法是可以机器实现的,而第一种似只能手工实现

 收到 谢谢版主大人 我好好琢磨下

ip2cidr("1.40.0.0","1.44.255.255");
00000000000001001111111111111111
echo long2ip(bindec('111111111111111111111')+ip2long('1.40.0.0')); //1.71.255.255 超出了指定IP的范围

0000000000000100 1111111111111111
要这样取

拆分理应从小区域开始
上来就是一大块,肯定是不合适的

谢谢您   我摸索下

把问题多分析一下
00000001011101110000000000000000 1.119.0.0
00000001011110000000000000000000 1.120.0.0
00000001011110010000000000000000 1.121.0.0
00000001011110100000000000000000 1.122.0.0
00000001011110110000000000000000 1.123.0.0
00000001011111000000000000000000 1.124.0.0
00000001011111010000000000000000 1.125.0.0
00000001011111100000000000000000 1.126.0.0
00000001011111110000000000000000 1.127.0.0
00000001100000000000000000000000 1.128.0.0
00000001100000010000000000000000 1.129.0.0
00000001100000100000000000000000 1.130.0.0
00000001100000110000000000000000 1.131.0.0
00000001100001000000000000000000 1.132.0.0
00000001100001010000000000000000 1.133.0.0
00000001100001100000000000000000 1.134.0.0
00000001100001110000000000000000 1.135.0.0
00000001100010000000000000000000 1.136.0.0
00000001100010010000000000000000 1.137.0.0
00000001100010100000000000000000 1.138.0.0
00000001100010110000000000000000 1.139.0.0
00000001100011000000000000000000 1.140.0.0
00000001100011010000000000000000 1.141.0.0
00000001100011100000000000000000 1.142.0.0
00000001100011110000000000000000 1.143.0.0
00000001100100000000000000000000 1.144.0.0
00000001100100010000000000000000 1.145.0.0
00000001100100100000000000000000 1.146.0.0
00000001100100110000000000000000 1.147.0.0
00000001100101000000000000000000 1.148.0.0
00000001100101010000000000000000 1.149.0.0
00000001100101100000000000000000 1.150.0.0
00000001100101110000000000000000 1.151.0.0
00000001100110000000000000000000 1.152.0.0
00000001100110010000000000000000 1.153.0.0
00000001100110100000000000000000 1.154.0.0
00000001100110110000000000000000 1.155.0.0
00000001100111000000000000000000 1.156.0.0
00000001100111010000000000000000 1.157.0.0
00000001100111100000000000000000 1.158.0.0
00000001100111110000000000000000 1.159.0.0
00000001101000000000000000000000 1.160.0.0

结束

echo ip2cidr('1.120.0.0', '1.159.255.255'), PHP_EOL;echo ip2cidr('1.120.0.0', '1.169.255.255'), PHP_EOL;echo ip2cidr('1.120.0.0', '1.179.255.255'), PHP_EOL;function ip2cidr($ip_start,$ip_end) {  if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return !trigger_error('ip 不合法', E_USER_NOTICE);   $ipl_start = ip2long($ip_start);  $ipl_end = ip2long($ip_end);  if($ipl_start>0 && $ipl_end<0) $delta = ($ipl_end + 4294967296) - $ipl_start;  else $delta = $ipl_end - $ipl_start;  $netmask = sprintf('%032b', $delta);  if(ip2long($ip_start)==0 && substr_count($netmask,"1")==32) return "0.0.0.0/0";  if($delta<0 or ($delta>0 && $delta%2==0)) return !trigger_error("区间数量不合法 $delta", E_USER_NOTICE);  for($mask=0; $mask<32; $mask++) if($netmask[$mask]==1) break;  if(substr_count($netmask,"0")!=$mask) {    $w = strrpos($netmask, '0') + 1;    $m = pow(2, 32-$w) - 1;    $ip_start = long2ip(($ipl_start & ~$m)+$m+1);    return long2ip($ipl_start & ~$m) . "/$w," . ip2cidr($ip_start,$ip_end);  };  return "$ip_start/$mask";} 
1.120.0.0/13,1.128.0.0/11
1.120.0.0/15,1.112.0.0/12,1.128.0.0/15,1.128.0.0/13,1.136.0.0/15,1.138.0.0/11
1.120.0.0/14,1.120.0.0/13,1.128.0.0/14,1.128.0.0/12,1.144.0.0/14,1.148.0.0/11

谢谢版主大人 尤其认识到自身不足 还要好好努力啊

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
不再担心下班前被领导叫住开小会,AI助手帮你自动生成会议纪要不再担心下班前被领导叫住开小会,AI助手帮你自动生成会议纪要Sep 04, 2023 pm 11:21 PM

讯飞听见升级会议纪要功能,可以将口语表述直接转化为书面稿,AI能够根据录音总结会议纪要。AI能够帮助您完成会议纪要的撰写工作8月31日,讯飞听见网页端进行了版本升级,新增了PC端实时录音功能,能够利用人工智能智能生成会议纪要。这一功能的推出将大大提高用户在会议后整理内容、跟进重点工作事项的效率。对于经常参加会议的人来说,这个功能无疑是一个非常实用的工具,能够节省大量时间和精力该功能的应用场景主要是PC电脑端录音转文字自动生成会议纪要,旨在为用户提供最优质的服务和最先进的技术,快速提升办公效率的产

如何使用PHP生成可刷新的图片验证码如何使用PHP生成可刷新的图片验证码Sep 13, 2023 am 11:54 AM

如何使用PHP生成可刷新的图片验证码随着互联网的发展,为了防止恶意攻击和机器自动操作现象,很多网站都使用了验证码来进行用户验证。其中一种常见的验证码类型就是图片验证码,通过生成一张包含随机字符的图片,要求用户输入正确的字符才能进行后续操作。本文将介绍如何使用PHP生成可刷新的图片验证码,并提供具体的代码示例。步骤一:创建验证码图片首先,我们需要创建一个用于生

如何使用PHP进行基本的自然语言生成如何使用PHP进行基本的自然语言生成Jun 22, 2023 am 11:05 AM

自然语言生成是一种人工智能技术,它能够将数据转换为自然语言文本。在当今的大数据时代,越来越多的业务需要将数据可视化或呈现给用户,而自然语言生成正是一种非常有效的方法。PHP是一种非常流行的服务器端脚本语言,它可以用于开发Web应用程序。本文将简要介绍如何使用PHP进行基本的自然语言生成。引入自然语言生成库PHP自带的函数库并不包括自然语言生成所需的功能,因此

使用Python中的pyWaffle生成一个华夫饼图使用Python中的pyWaffle生成一个华夫饼图Aug 17, 2023 am 11:49 AM

数据可视化对于高效的信息理解和展示至关重要。在众多可用的图表类型中,华夫饼图以方形瓦片在网格状结构中显示数据的新颖方式。强大的Python模块PyWaffle方便了华夫饼图的开发,类似于许多计算和数据分析方法。在本文中,我们将看看如何使用复杂的Python模块PyWaffle创建华夫饼图。让我们安装PyWafle并看看如何使用它来可视化分类数据。在您的cmd中运行以下命令来安装该库,然后将其导入到您的代码中pipinstallpywaffleExample1的中文翻译为:示例1在这个例子中,我们

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

如何使用PHP生成带有时间限制的二维码?如何使用PHP生成带有时间限制的二维码?Aug 26, 2023 pm 04:34 PM

如何使用PHP生成带有时间限制的二维码?随着移动支付和电子门票的普及,二维码成为了一种常见的技术。在很多场景中,我们可能需要生成一种带有时间限制的二维码,即使在一定时间后,该二维码也将失效。本文将介绍如何使用PHP生成带有时间限制的二维码,并提供代码示例供参考。安装PHPQRCode库要使用PHP生成二维码,我们需要先安装PHPQRCode库。这个库

word目录生成错乱怎么办word目录生成错乱怎么办Feb 20, 2024 am 08:08 AM

word目录生成错乱怎么办随着科技的发展,电子文档已经成为我们日常工作和学习中不可或缺的一部分。而在编辑电子文档时,尤其是长篇文章或论文中,目录的生成是一个非常重要的步骤。目录能够方便读者查找到文章的内容和结构,提高阅读效率。然而,有时候我们在生成目录的过程中会遇到一些问题,比如目录生成出错,顺序混乱等。那么,如果word目录生成错乱,我们应该如何解决呢?首

如何生成在在线答题中的错题本如何生成在在线答题中的错题本Sep 25, 2023 am 10:24 AM

如何生成在线答题的错题本在现如今的信息时代,网上答题已经成为了许多学生和教育工作者的常见任务。而错题一直是学习过程中的难题之一,很多人都希望能够方便地生成在线答题的错题本,以便更好地复习和掌握知识。本文将介绍如何通过编程实现在线答题错题本的生成功能,并提供具体的代码示例。第一步:搭建网页界面生成在线答题错题本需要一个网页界面来显示题目和答案。可以使用HTML

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구