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

如何使用PowerShell将IP数值转换为IPv6地址及解决转换报错

解决IPv6数值转IPv6地址的转换失败问题

你的代码存在两个核心问题:

  • 仅处理IPv4范围内的数值(判断条件限制在0到0xFFFFFFFF,即2^32-1),而你输入的281470698520576(对应十六进制0x1000000000000)远大于该范围,属于IPv6地址对应的数值区间。
  • 使用[Int64]解析数值,但IPv6地址需要128位的数值空间,Int64(64位)无法容纳完整的IPv6数值,且IPAddress的64位整数构造函数仅支持IPv4地址转换。

下面是支持IPv6数值转换的修正函数,使用[UInt128]处理128位数值,并转换为符合网络字节序的16字节数组来构造IPv6地址:

function Convert-NumberToIP
{
    param(
        [Parameter(Mandatory=$true)][string]$number
    )

    [UInt128] $numberUInt128 = 0
    if([UInt128]::TryParse($number, [ref]$numberUInt128))
    {
        # 将128位数值转换为16字节的大端序数组(符合IPv6网络字节序要求)
        $ipBytes = [byte[]]::CreateInstance([byte], 16)
        for ($i = 15; $i -ge 0; $i--)
        {
            $ipBytes[$i] = [byte]($numberUInt128 -band 0xFF)
            $numberUInt128 = $numberUInt128 -shr 8
        }
        # 构造IPAddress并返回标准格式的地址字符串
        ([IPAddress]$ipBytes).IPAddressToString
    }
    else
    {
        Write-Error "无法将输入字符串转换为有效的128位无符号整数"
    }
}

# 测试转换
$startIP = Convert-NumberToIP -number '281470698520576'
$endIP = Convert-NumberToIP -number '281470698520580'

# 输出结果
$startIP  # 输出:::1000:0
$endIP    # 输出:::1000:4

关键说明

  • 使用[UInt128]类型解析输入数值,确保能覆盖IPv6所需的完整128位地址空间。
  • 通过循环逐字节拆分128位数值,从最低位到最高位填充字节数组,生成符合IPv6要求的大端序字节序列。
  • 用生成的16字节数组构造IPAddress对象,调用IPAddressToString直接得到标准压缩格式的IPv6地址。

内容的提问来源于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.30 18:06:40