Skip to content

Instantly share code, notes, and snippets.

@mlhDevelopment
Forked from davidjenni/cidrToIpRange.ps1
Last active September 10, 2024 13:33
Show Gist options
  • Save mlhDevelopment/87d3bfca66bb57d73726611a7c153fe8 to your computer and use it in GitHub Desktop.
Save mlhDevelopment/87d3bfca66bb57d73726611a7c153fe8 to your computer and use it in GitHub Desktop.
CIDR to IP range conversion using PowerShell
# calculate IP address range from CIDR notation
# https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
function cidrToIpRange {
param (
[string] $cidrNotation
)
$addr, $maskLength = $cidrNotation -split '/'
[int]$maskLen = 0
if (-not [int32]::TryParse($maskLength, [ref] $maskLen)) {
write-warning "No mask, setting to /32"
$masklen = 32
}
if (0 -gt $maskLen -or $maskLen -gt 32) {
throw "CIDR mask length must be between 0 and 32"
}
$ipAddr = [Net.IPAddress]::Parse($addr)
if ($ipAddr -eq $null) {
throw "Cannot parse IP address: $addr"
}
if ($ipAddr.AddressFamily -ne [Net.Sockets.AddressFamily]::InterNetwork) {
throw "Can only process CIDR for IPv4"
}
$shiftCnt = 32 - $maskLen
$mask = -bnot ((1 -shl $shiftCnt) - 1)
$ipNum = [Net.IPAddress]::NetworkToHostOrder([BitConverter]::ToInt32($ipAddr.GetAddressBytes(), 0))
$ipStart = ($ipNum -band $mask)
$ipEnd = ($ipNum -bor (-bnot $mask))
# return
return [PSCustomObject]@{
Start = ([BitConverter]::GetBytes([Net.IPAddress]::HostToNetworkOrder($ipStart)) | ForEach-Object { $_ } ) -join '.'
End = ([BitConverter]::GetBytes([Net.IPAddress]::HostToNetworkOrder($ipEnd)) | ForEach-Object { $_ } ) -join '.'
}
}
# Test
$ips = @('1.2.3.4/24', '9.8.7.6')
$ips | % { cidrToIpRange $_ } | sort-object start
@tenielg
Copy link

tenielg commented Sep 10, 2024

Looks good (Did a few tests).
Missing a } on row 37

@mlhDevelopment
Copy link
Author

Yup, you're right. Updated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment