You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:22:05