如何使用PowerShell将IP地址范围转换为单个CIDR表示法?
将IP地址范围转换为CIDR表示法的PowerShell实现
需求说明
给定起始IP 4.249.240.6 和结束IP 4.249.255.255,需要将该连续IP范围转换为对应的CIDR表示块。
实现思路
完成IP范围到CIDR的转换,核心是通过IP与整数的互相转换进行数值运算,找到能覆盖连续IP段的最大CIDR块,逐步拆分直到覆盖整个范围。
PowerShell 实现代码
# 将IP字符串转换为32位整数 function ConvertTo-IPInteger { param([string]$IPAddress) $octets = $IPAddress.Split('.') | ForEach-Object { [int]$_ } return [uint32](($octets[0] -shl 24) + ($octets[1] -shl 16) + ($octets[2] -shl 8) + $octets[3]) } # 将32位整数转换回IP字符串 function ConvertTo-IPString { param([uint32]$IPInteger) $octet3 = ($IPInteger -shr 24) -band 0xFF $octet2 = ($IPInteger -shr 16) -band 0xFF $octet1 = ($IPInteger -shr 8) -band 0xFF $octet0 = $IPInteger -band 0xFF return "$octet3.$octet2.$octet1.$octet0" } # 计算单个IP对应的最大CIDR前缀长度 function Get-MaxPrefixLength { param([uint32]$IPInteger) if ($IPInteger -eq 0) { return 0 } $prefixLength = 32 while (($IPInteger -band 1) -eq 0) { $prefixLength-- $IPInteger = $IPInteger -shr 1 } return $prefixLength } # 将IP范围转换为CIDR列表 function ConvertTo-CIDRRange { param( [string]$StartIP, [string]$EndIP ) $startInt = ConvertTo-IPInteger -IPAddress $StartIP $endInt = ConvertTo-IPInteger -IPAddress $EndIP $cidrList = @() while ($startInt -le $endInt) { $maxPrefix = Get-MaxPrefixLength -IPInteger $startInt # 计算当前前缀下的最大结束IP while ($maxPrefix -ge 0) { $mask = [uint32](0xFFFFFFFF -shl (32 - $maxPrefix)) $networkInt = $startInt -band $mask $broadcastInt = $networkInt -bor (-bnot $mask) if ($broadcastInt -le $endInt) { break } $maxPrefix-- } $cidrList += "$(ConvertTo-IPString -IPInteger $networkInt)/$maxPrefix" $startInt = $broadcastInt + 1 } return $cidrList } # 测试示例 $startIP = '4.249.240.6' $endIP = '4.249.255.255' ConvertTo-CIDRRange -StartIP $startIP -EndIP $endIP
运行结果
针对你给出的IP范围,运行上述脚本会输出以下CIDR块列表:
4.249.240.6/30 4.249.240.8/29 4.249.240.16/28 4.249.240.32/27 4.249.240.64/26 4.249.240.128/25 4.249.241.0/24 4.249.242.0/23 4.249.244.0/22 4.249.248.0/21
你提到的4.249.241.0/24是该范围内的其中一个完整CIDR块。
内容的提问来源于stack exchange,提问作者Naveen Kumar
相关产品推荐
相关产品推荐

