나는이 함께 결국, $ ipv6cidr 배열입니다 CIDR 형식의 IPv6 주소 ...의
#convert IPv6 CIDR to IPv6 range
[email protected]()
foreach($ip in $ipv6cidr){
[email protected]()
$netbits=$ip.Split("/")[1]
$ip = $ip.Split("/")[0]
$ip=$ip -replace '::',''
$ip=$ip.Split(':')
foreach($p in $ip){
$p='0x'+$p
$bin=[Convert]::ToString($p, 2).PadLeft(16,'0')
$binip+=$bin
}
$binip=$binip -join ''
If($binip.Length -lt $netbitslength)
{
$difference=$netbitslength-$binip.Length
$missing= "1" * $difference
[string]$missing=$missing
$missing=$missing.Padleft(16,'0')
$binip=$binip+$missing
$binip=$binip -replace ',',''
$binstart=$binip.PadRight(128,'0')
$binend=$binip.PadRight(128,'1')
}
elseIf($binip.Length -gt $netbitslength){
$binstart=$binip.substring(0,$netbits).padright(128,'0')
$binend= $binip.substring(0,$netbits).padright(128,'1')
}
[email protected]()
While ($binstart)
{
$x,$binstart= ([char[]]$binstart).where({$_},'Split',16)
$startbin+=$x -join ''
}
[email protected]()
foreach($start in $startbin){
$start=[Convert]::ToInt32("$start",2)
$starts+='{0:X4}' -f $start
}
$finalstartip=$starts -join ':'
[email protected]()
While ($binend)
{
$x,$binend= ([char[]]$binend).where({$_},'Split',16)
$endbin+=$x -join ''
}
[email protected]()
foreach($end in $endbin){
$end=[Convert]::ToInt32("$end",2)
$ends+='{0:X4}' -f $end
}
$finalendip=$ends -join ':'
$ipv6range+=$finalstartip+'-'+$finalendip
}
나는 "정상화"당신은 고정 된 형식이되도록 주어진 CIDR의 형식으로 시작하는 것을 권 해드립니다
- '억제 해제'0을 선도하고, 0을 작성하는 :: 대신에 사용하십시오. (예 :'2a01 : 111 : f406 : c00 ::/64'는'2a01 : 0111 : f406 : 0c00 : 0000 : 0000 : 0000 : 0000/64'로 변환됩니다. 귀하의 목적을 달성하는 방법을 쉽게 해결할 수 있습니다. –
추가 힌트 :'-split'과'-f' 연산자가 도움이 될 수 있습니다. –
@JeffZeitlin 고맙습니다. 실현 가능한 해결책입니다. 그러나 어떤 경우에 대해서도 정확성에 대해 우려하고 있습니다. (목록에 100+가 있습니다.) –