【问题标题】:How to convert IP number to IPV6 using PowerShell?如何使用 PowerShell 将 IP 号码转换为 IPV6?
【发布时间】:2023-02-23 00:34:42
【问题描述】:

我有包含与 IPv6 相关的 IP 编号的 CSV,我正在读取它们并将其转换为 IPv6 IP 地址,但我需要将其转换为 CIDR 表示法,目前该地址失败。

我正在使用以下代码但出现错误:

无法将值“281470698520576”转换为类型“System.Net.IPAddress”。错误:“指定的参数是 超出有效值范围。

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

    [Int64] $numberInt = 0
    
    if([Int64]::TryParse($number, [ref]$numberInt))
    {
        if(($numberInt -ge 0) -and ($numberInt -le 0xFFFFFFFFl))
        {
            #([IPAddress] $numberInt).ToString()
            $ipBytes = ([IPAddress]$numberInt).GetAddressBytes()
            [array]::Reverse($ipBytes)
            ([IPAddress]$ipBytes).IPAddressToString
        }
    }
}

Convert-NumberToIP -number '281470698520576'

【问题讨论】:

  • 请记住,IPv6 地址是 128 位无符号整数,而不是 64 位整数。
  • @RonMaupin 当我使用0xFFFFFFFFFFFFFFFFFF时它说的是The numeric constant is not valid
  • 正确的。大多数语言不直接支持 128 位整数。

标签: powershell ip ipv6 ip2location


【解决方案1】:

要在 PowerShell 中使用 128 位整数,您可以利用 .NET System.Numerics.BigInteger 类。像这样:

$ipv6Decimal = [System.Numerics.BigInteger]::Parse($number)

然后您可以使用ToByteArray()BigInt转换为byte array。 然而,生成的数组需要“填充”到 16 个字节并反转(主机与网络顺序)。

这对我有用:

function Convert-NumberToIPv6
{
    param(
        [Parameter(Mandatory=$true)][string]$number
    )
     
    $ipv6Decimal  = [System.Numerics.BigInteger]::Parse($number)
    $ipv6Bytes = $ipv6Decimal.ToByteArray()
    # pad to 16 bytes
    [Array]::Resize([ref]$ipv6Bytes, 16)

    # reverse the bytes
    [Array]::Reverse($ipv6Bytes)
    
    # provide a scope identifier to prevent "cannot find overload error"
    $ipAddress = New-Object Net.IPAddress($ipv6Bytes, 0)
    $ipAddress.ToString()
}

所以输出:Convert-NumberToIPv6 -number '281470698520576'::ffff:1.0.0.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多