如何使用PowerShell将带掩码的网络地址转换为CIDR表示法?
子网掩码转CIDR前缀长度(PowerShell实现)
网上能找到不少把CIDR转成子网掩码的示例,但反过来用PowerShell实现子网掩码转CIDR前缀长度的例子却不多。你已经搞定了网卡数据的获取:
$ActiveNic = Get-CimInstance Win32_NetworkAdapterConfiguration | where IPEnabled [IpAddress]$MyIp = $ActiveNic.IPAddress[0] [IpAddress]$MyMask = $ActiveNic.IPSubnet[0] [IpAddress]$NetIp = $MyIp.Address -band $MyMask.Address
这里给你两种更简单易懂的方法来统计掩码中1的数量(也就是CIDR前缀长度):
方法1:二进制字符串统计法
逻辑直观,把子网掩码转成二进制字符串后直接数1的个数:
# 获取掩码字节并反转(IPv4字节序是小端,需转成网络字节序) $maskBytes = $MyMask.GetAddressBytes() [array]::Reverse($maskBytes) # 把每个字节转成8位二进制字符串并拼接 $binaryMask = ($maskBytes | ForEach-Object { [Convert]::ToString($_, 2).PadLeft(8, '0') }) -join '' # 统计1的数量 $cidrPrefix = ($binaryMask.ToCharArray() | Where-Object { $_ -eq '1' }).Count Write-Host "对应的CIDR前缀长度: $cidrPrefix"
方法2:数学计算法(一行搞定)
利用子网掩码的整数特性,通过对数计算快速得到结果,非常简洁:
$cidrPrefix = 32 - [math]::Floor([math]::Log((-not $MyMask.Address) + 1, 2)) Write-Host "对应的CIDR前缀长度: $cidrPrefix"
原理:子网掩码的Address属性是无符号32位整数,对它取反后加1,得到的数值对应主机位的总数量(比如掩码255.255.255.0取反加1是256,也就是2^8),取以2为底的对数得到主机位数,用32减去主机位数就是前缀长度。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

