各位大神有没有生成多个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<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";

} 这个函数不能生成多个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

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

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

cidr php,PHP 如何实现ip2cidr(生成多个cidr)相关推荐

  1. cidr php,PHP 怎么实现ip2cidr(生成多个cidr)

    PHP 如何实现ip2cidr(生成多个cidr) 各位大神有没有生成多个cidr的函数 例如1.120.0.01.159.255.255 生成 1.120.0.0/13 1.128.0.0/11 - ...

  2. cidr php,PHP怎么实现ip2cidr(生成多个cidr)

    PHP 如何实现ip2cidr(生成多个cidr) 各位大神有没有生成多个cidr的函数 例如1.120.0.01.159.255.255 生成 1.120.0.0/13 1.128.0.0/11 - ...

  3. cidr计算器android,无类别域间路由(CIDR)网络地址计算器

    CIDR网络地址计算器 IPv4 IPv6 输入 IP地址范围 IP地址和掩码 CIDR格式地址 起始 结束 IP地址 子网掩码 CIDR地址 输入 IP地址范围 IP地址和前缀长度 CIDR格式地址 ...

  4. CIDR合并Java_CIDR

    9.12 网络地址函数和操作符 IP网络地址类型cidr和inet,支持表9.1中的比较运算符,同时也支持表9.38及9.39中列出的特殊操作类型和函数. cidr值可隐式转换为inet:因此,凡事c ...

  5. 4.3 计算机网络之IPv4(IPv4分组、IPv4地址、NAT、子网划分与子网掩码、CIDR、ARP协议、DHCP、ICMP)

    文章目录 0.思维导图 1.TCP/IP协议栈 2.IPv4分组 (1)IPv4分组格式 (2)IP数据报分片 (3)网络层转发分组的流程 3.IPv4与NAT (1)IPv4地址 ① 组成与分类 ② ...

  6. CIDR地址块及其子网划分

    转载自:https://blog.csdn.net/dan15188387481/article/details/49873923 其中有些IP错误,已修正. 1. 原始的IP地址表示方法及其分类 I ...

  7. CIDR无类别域间路由

    CIDR中文全称是无分类域间路由选择,英文全称是Classless Inter-Domain Routing,在平常,大家多称之为无分类编址,它也是构成超网的一种技术实现.CIDR在一定程度上解决了路 ...

  8. IP地址划分, 常见的CIDR划分,子网掩码对应表及在线CIDR工具

    IP地址CIDR划分方式的大致方式是下面的表示方式 IP地址= {<网络前缀>,<主机号>} 例如202.194.20.138/19,此IP中前19位为网络前缀,后13位为主机 ...

  9. 子网掩码是什么?子网掩码及其CIDR斜杠表示法

    网络中的每台机器都必须知道主机地址的哪部分为子网地址,这是通过给每台机器分配子网掩码实现的.子网掩码是一个长32 位的值,让IP分组的接收方能够将IP 地址的网络ID 部分和主机ID部分区分开来. 网 ...

最新文章

  1. 你说我画,你画我说:全球最大中文跨模态生成模型文心ERNIE-ViLG来了!
  2. 判断数据是否服从某一分布(二)——简单易用fitdistrplus包
  3. 安装 node-sass 时报错
  4. 返回空的List集合
  5. ElementUI的el-table怎样隐藏某一列
  6. android 自定义baseadapter listview,android之ListView和BaseAdapter的组合使用
  7. 管理任务执行-如何排任务优先级
  8. 下面的一堆文字为了说明一件事情---.NET程序,内存溢出,如何控制.
  9. Angular Js 判断对象不为空对象的三种方法
  10. ubuntu部署安装 MySQL 5.7
  11. iOS 如何把图片资源打包成bundle文件及遇到的坑(详解)
  12. 单变量分析、组合变量分析
  13. java记账软件开发_Java项目之家庭记账软件
  14. 《搭建你的数字积木 数字电路与逻辑设计》(1)
  15. 几款电纸书阅读器参数对比
  16. 操作系统µC/OS的故事,最终Micrium被Silicon Labs收购
  17. xadsafe做暗刷_XADsafe去广告热心网友共享规则库部分开源(11月13更新)
  18. 8.字典操作。建立一个月份与天数的字典monthdays,月份为“Jan”“Feb”“Mar”“Apr”“May”“Jun” “Jul” “Aug” “Sep” “Oct” “Nov“ “Dec“
  19. 云计算与云原生 — OpenShift 部署实践
  20. CentOS6 Samba服务器配置

热门文章

  1. C编译时编码设置(UTF-8、GBK编码格式)
  2. QQ-weiyun(微云)-云储存
  3. go语言调用c语言动态库及交叉编译
  4. 收集优化统计数据(Optimizer Statistics)的最佳实践方法
  5. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx.xxxMapper.selec
  6. android简单loading,一个简单能用的LoadingDialog
  7. 什么是 Embedding()
  8. League of Legends
  9. java scheduled_Spring内置定时任务调度@Scheduled使用详解
  10. 2751: [HAOI2012]容易题(easy)