Last active
September 22, 2015 18:59
-
-
Save techthoughts2/8f40a1a46ed1f9b1c3bb to your computer and use it in GitHub Desktop.
Converts between PrefixLength and subnet mask.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#obatined from: https://gallery.technet.microsoft.com/scriptcenter/Convert-SubnetMask-80401493 | |
<# | |
.SYNOPSIS | |
Converts between PrefixLength and subnet mask. | |
.DESCRIPTION | |
This script converts between PrefixLength and subnet mask parameters, these parameters define the size of a subnet for IPv4 addresses. | |
This script assumes valid subnet mask input and does not support scenarios such as non-contiguous subnet masks. | |
.INPUTS | |
None | |
.OUTPUTS | |
The script outputs a PrefixLength if SubnetMask was entered, or a SubnetMask if a PrefixLength was entered. | |
.NOTES | |
Requires Windows 8 or later. | |
#> | |
function Format-Prefix{ | |
param( | |
[Parameter(ParameterSetName="SubnetMask",Mandatory=$True)][string]$SubnetMask, | |
[Parameter(ParameterSetName="PrefixLength",Mandatory=$True)][int]$PrefixLength) | |
#################################### | |
#User provided a prefix | |
if ($PrefixLength) | |
{ | |
$PrefixLengthExit = $PrefixLength | |
if ($PrefixLength -gt 32) | |
{ | |
write-host "Invalid input, prefix length must be less than 32" | |
exit(1) | |
} | |
$bitArray="" | |
for($bitCount = 0; $PrefixLength -ne "0"; $bitCount++) | |
{ | |
$bitArray += '1' | |
$PrefixLength = $PrefixLength - 1; | |
} | |
#################################### | |
#Fill in the rest with zeroes | |
While ($bitCount -ne 32) | |
{ | |
$bitArray += '0' | |
$bitCount++ | |
} | |
#################################### | |
#Convert the bit array into subnet mask | |
$ClassAAddress = $bitArray.SubString(0,8) | |
$ClassAAddress = [Convert]::ToUInt32($ClassAAddress, 2) | |
$ClassBAddress = $bitArray.SubString(8,8) | |
$ClassBAddress = [Convert]::ToUInt32($ClassBAddress, 2) | |
$ClassCAddress = $bitArray.SubString(16,8) | |
$ClassCAddress = [Convert]::ToUInt32($ClassCAddress, 2) | |
$ClassDAddress = $bitArray.SubString(24,8) | |
$ClassDAddress = [Convert]::ToUInt32($ClassDAddress, 2) | |
$SubnetMaskExit = "$ClassAAddress.$ClassBAddress.$ClassCAddress.$ClassDAddress" | |
} | |
#################################### | |
##User provided a subnet mask | |
if ($SubnetMask) | |
{ | |
#################################### | |
#Ensure valid IP address input. Note this does not check for non-contiguous subnet masks! | |
$Address=[System.Net.IPaddress]"0.0.0.0" | |
Try | |
{ | |
$IsValidInput=[System.Net.IPaddress]::TryParse($SubnetMask, [ref]$Address) | |
} | |
Catch | |
{ | |
} | |
Finally | |
{ | |
} | |
if ($IsValidInput -eq $False) | |
{ | |
Write-Host "Invalid Input. Please enter a properly formatted subnet mask." | |
Exit(1) | |
} | |
#################################### | |
#Convert subnet mask to prefix length | |
If($IsValidInput) | |
{ | |
$PrefixArray=@() | |
$PrefixLength = 0 | |
$ByteArray = $SubnetMask.Split(".") | |
#################################### | |
#This loop converts the bytes to bits, add zeroes when necessary | |
for($byteCount = 0; $byteCount-lt 4; $byteCount++) | |
{ | |
$bitVariable = $ByteArray[$byteCount] | |
$bitVariable = [Convert]::ToString($bitVariable, 2) | |
if($bitVariable.Length -lt 8) | |
{ | |
$NumOnes=$bitVariable.Length | |
$NumZeroes=8-$bitVariable.Length | |
for($bitCount=0; $bitCount -lt $NumZeroes; $bitCount++) | |
{ | |
$Temp=$Temp+"0" | |
} | |
$bitVariable=$Temp+$bitVariable | |
} | |
#################################### | |
#This loop counts the bits in the prefix | |
for($bitCount=0; $bitCount -lt 8; $bitCount++) | |
{ | |
if ($bitVariable[$bitCount] -eq "1") | |
{ | |
$PrefixLength++ | |
} | |
$PrefixArray=$PrefixArray + ($bitVariable[$bitCount]) | |
} | |
} | |
#################################### | |
#Check if the subnet mask was contiguous, fail if it wasn't. | |
$Mark=$False | |
foreach ($bit in $PrefixArray) | |
{ | |
if($bit -eq "0") | |
{ | |
if($Mark -eq $False) | |
{ | |
$Mark=$True | |
} | |
} | |
if($bit -eq "1") | |
{ | |
if($Mark -eq $True) | |
{ | |
Write-Host "Invalid Input. Please enter a properly formatted subnet mask." | |
Exit(1) | |
} | |
} | |
} | |
$SubnetMaskExit = $SubnetMask | |
$PrefixLengthExit = $PrefixLength | |
} | |
} | |
##Create the object to be Exited to the console | |
$Exit = new-object Object | |
Add-Member -InputObject $Exit -Name PrefixLength -Value $PrefixLengthExit -Type NoteProperty | |
Add-Member -InputObject $Exit -Name SubnetMask -Value $SubnetMaskExit -Type NoteProperty | |
$Exit | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment