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

如何使用PowerShell将IPv6地址范围转换为单个CIDR表示法?

IPv6地址范围转单个CIDR表示法的PowerShell实现

要把一段连续的IPv6地址范围转换为单个CIDR表示,核心是找到起始地址和结束地址的最长公共前缀,再结合起始地址生成CIDR格式。以下是可直接使用的PowerShell实现:

实现脚本

function ConvertTo-Ipv6Cidr {
    param(
        [Parameter(Mandatory=$true)]
        [string]$StartIp,
        [Parameter(Mandatory=$true)]
        [string]$EndIp
    )

    # 将IPv6地址转换为字节数组
    try {
        $startBytes = [System.Net.IPAddress]::Parse($StartIp).GetAddressBytes()
        $endBytes = [System.Net.IPAddress]::Parse($EndIp).GetAddressBytes()
    }
    catch {
        Write-Error "无效的IPv6地址格式"
        return
    }

    # 计算最长公共前缀的位数
    $prefixLength = 0
    for ($i = 0; $i -lt $startBytes.Length; $i++) {
        $diff = $startBytes[$i] -bxor $endBytes[$i]
        if ($diff -eq 0) {
            $prefixLength += 8
            continue
        }
        # 计算当前字节中相同的位数
        for ($bit = 7; $bit -ge 0; $bit--) {
            if (($diff -shr $bit) -band 1) {
                break
            }
            $prefixLength++
        }
        break
    }

    # 验证是否是连续的单一CIDR范围(结束地址需是该前缀下的最后一个地址)
    $maskBytes = New-Object byte[] 16
    $remainingBits = 128 - $prefixLength
    if ($remainingBits -gt 0) {
        $fullBytes = [math]::Floor($remainingBits / 8)
        $partialBits = $remainingBits % 8
        for ($i = 0; $i -lt $fullBytes; $i++) {
            $maskBytes[15 - $i] = 0xFF
        }
        if ($partialBits -gt 0) {
            $maskBytes[15 - $fullBytes] = (0xFF -shr (8 - $partialBits)) -bxor 0xFF
        }
    }
    $networkBytes = $startBytes -band $maskBytes
    $broadcastBytes = $networkBytes -bxor $maskBytes
    if (-not ($broadcastBytes -join ',' -eq $endBytes -join ',')) {
        Write-Warning "该地址范围无法用单个CIDR表示"
        return
    }

    # 返回CIDR格式结果
    return "$StartIp/$prefixLength"
}

测试示例

# 测试给定的地址范围
$startIP = '::ffff:1.0.0.0'
$endIP = '::ffff:1.0.0.255'
ConvertTo-Ipv6Cidr -StartIp $startIP -EndIp $endIP

输出结果:

::ffff:1.0.0.0/120

说明

  1. 脚本会先校验输入的IPv6地址有效性,无效地址会抛出错误
  2. 通过异或运算计算起始和结束地址的差异,找到最长公共前缀的长度
  3. 额外验证该前缀对应的网络广播地址是否等于输入的结束地址,确保范围能用单个CIDR覆盖
  4. 若无法用单个CIDR表示,会输出警告并返回空

内容的提问来源于stack exchange,提问作者Naveen Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:24:26