Skip to content

Instantly share code, notes, and snippets.

@romero126
Last active April 26, 2025 05:13
Show Gist options
  • Save romero126/f25f804faae5a9d6504ebf8722b48816 to your computer and use it in GitHub Desktop.
Save romero126/f25f804faae5a9d6504ebf8722b48816 to your computer and use it in GitHub Desktop.
ConvertFrom-CidrToIPvNetwork

ConvertFrom-CidrToIPvNetwork -vlsm "10.202.84.0/25"

ConvertFrom-CidrToIPvNetwork -vlsm "2001:489a:a0d::/64"

Test-IpAddressinNetwork -ipaddress -vlsm 10.202.84.0/25

function ConvertFrom-CidrToIPvNetwork
{
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline)]
[string] $vlsm
)
$convertToIpAddress = {
param(
[int] $byteRange,
[System.Numerics.BigInteger]$bigInt
)
$bytes = $bigInt.ToByteArray()
$null = [System.Array]::Reverse($bytes, 0, $byteRange)
$null = [System.Array]::Resize([ref] $bytes, $byteRange)
[System.Net.IpAddress]::new($bytes)
}
$ipAddress, $prefix = $vlsm -split '/'
$ipAddressIP = [System.Net.IPAddress]::Parse($ipAddress)
if ($ipAddressIP.AddressFamily -eq 'InterNetwork') {
# use V4
$byteRange = 4
} else {
# Use V6
$byteRange = 16
}
$ipAddress = [System.Numerics.BigInteger]::new( $ipAddressIP.GetAddressBytes()[($byteRange-1)..0])
#$ipAddress = [bigint]::new( ([byte[]]$ipAddressIP.GetAddressBytes()[($byteRange-1)..0]), $true, $true )
$broadcastAddress = ( [System.Numerics.BigInteger]1 -shl ($byteRange* 8) ) - 1
$subnetMask = $broadcastAddress -shl (($byteRange*8) - $prefix)
$networkAddress = $ipAddress -band $subnetMask
$networkBroadcast = $networkAddress -bor (-bnot $subnetMask)
$startIPAddress = $networkAddress + 1
$endIPAddress = $networkBroadcast - 1
$total = [System.Numerics.BigInteger]::Pow(2, (($byteRange*8)- $prefix)) - 2
[PSCustomObject][Ordered]@{
IpAddress = $ipAddressIP
AddressFamily = $ipAddressIP.AddressFamily
Prefix = $prefix
Network = & $convertToIpAddress $byteRange $networkAddress
SubnetMask = & $convertToIpAddress $byteRange $subnetMask
BroadcastAddress = & $convertToIpAddress $byteRange $broadcastAddress
Range = [PSCustomObject][Ordered]@{
Start = & $convertToIpAddress $byteRange $startIPAddress
End = & $convertToIpAddress $byteRange $endIPAddress
Total = $total
}
}
}
function Test-IpAddressinNetwork {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline)]
[string] $ipAddress,
[Parameter(Mandatory, ValueFromPipeline)]
[string] $vlsm
)
$ipAddressIP = [System.Net.IPAddress]::Parse($ipAddress)
$vlsmNetwork = ConvertFrom-CidrToIPvNetwork -vlsm $vlsm
if ($ipAddressIP.AddressFamily -eq 'InterNetwork') {
# use V4
$byteRange = 4
} else {
# Use V6
$byteRange = 16
}
$ipAddress = [System.Numerics.BigInteger]::new( $ipAddressIP.GetAddressBytes()[($byteRange-1)..0])
$networkAddress = [System.Numerics.BigInteger]::new( $vlsmNetwork.Network.GetAddressBytes()[($byteRange-1)..0])
$subnetMask = [System.Numerics.BigInteger]::new( $vlsmNetwork.SubnetMask.GetAddressBytes()[($byteRange-1)..0])
return ($ipAddress -band $subnetMask) -eq ($networkAddress -band $subnetMask)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment