Free IP Calculator
Bob Sneidar
bobsneidar at iotecdigital.com
Thu Jan 15 18:18:00 EST 2015
OK I took some time today to really go through this IPCalc function. Note to self: Don’t try to write publicly distributable code quickly.
That being said, I’ve been asked to include this function in the library of commands and functions everyone’s been talking about. So I am going to post the code here, and anyone wanting a shot at breaking it (as if you could) give it a go. NOTE: There is no error checking as of yet so you *could* break it by passing an invalid value like 256.256.256.0 for a subnet address.
Meanwhile I am going to write some pretty thorough error checking before I submit it for public consumption, so that there are no values you can pass to it that would break it or otherwise return bad values.
function IPCalc theIPAddress, theSubnetMask
-- pass either CIDR notation in theIPAddress or else a standard IP and subnet mask
-- returns an array of the following values:
-- bcastaddr
-- cidraddr
-- cidrdepth
-- firstaddr
-- ipaddress
-- lastaddr
-- subnetaddr
-- subnetmask
-- usablecountset the itemdelimiter to "."
set the itemdelimiter to "."
-- initial setup
set the numberFormat to "00000000"
-- detemine format
if theIPAddress contains "/" then
put offset("/", theIPAddress) into theCIDRDelim
put char theCIDRDelim +1 to -1 of theIPAddress into theCIDRDepth
put charx("1", theCIDRDepth) & charx("0", 32-theCIDRDepth) into theBinSubnetMask
put baseconvert(char 1 to 8 of theBinSubnetMask, 2, 10) into item 1 of theSubnetMask
put baseconvert(char 9 to 16 of theBinSubnetMask, 2, 10) into item 2 of theSubnetMask
put baseconvert(char 17 to 24 of theBinSubnetMask, 2, 10) into item 3 of theSubnetMask
put baseconvert(char 25 to 32 of theBinSubnetMask, 2, 10) into item 4 of theSubnetMask
put char 1 to theCIDRDelim -1 of theIPAddress into theIPAddress
else
-- convert the subnet mask to binary
put 0 into whichOctet
repeat for each item theOctet in theSubnetMask
add 1 to whichOctet
put value(baseConvert(theOctet, 10, 2)) after theBinSubnetMask
end repeat
put offset("0", theBinSubnetMask) -1 into theCIDRDepth
end if
-- convert the ip address to binary
put 0 into whichOctet
repeat for each item theOctet in theIPAddress
add 1 to whichOctet
put baseConvert(theOctet, 10, 2) into theBinValue
add 0 to theBinValue
put theBinValue after theBinIPAddress
end repeat
-- calculate the binary subnet address
put char 1 to theCIDRDepth of theBinIPAddress into theBinNetworkAddr
put char theCIDRDepth +1 to -1 of theBinIPAddress into theBinNodeAddr
put theBinNodeAddr into theBinSubnetNodeAddr
set the numberFormat to "0"
replace "1" with "0" in theBinSubnetNodeAddr
put theBinNetworkAddr & theBinSubnetNodeAddr into theBinSubnetAddr
-- convert the binary subnet address to decimal
put baseconvert(char 1 to 8 of theBinSubnetAddr, 2, 10) into item 1 of theSubnetAddr
put baseconvert(char 9 to 16 of theBinSubnetAddr, 2, 10) into item 2 of theSubnetAddr
put baseconvert(char 17 to 24 of theBinSubnetAddr, 2, 10) into item 3 of theSubnetAddr
put baseconvert(char 25 to 32 of theBinSubnetAddr, 2, 10) into item 4 of theSubnetAddr
-- calculate the first usable IP address
put theSubnetAddr into theFirstAddr
add 1 to item 4 of theFirstAddr
-- calculate the binary broadcast address
put theBinNodeAddr into theBinBcastNodeAddr
replace "0" with "1" in theBinBcastNodeAddr
put theBinNetworkAddr & theBinBcastNodeAddr into theBinBcastAddr
-- convert the binary broadcast address to decimal
put baseconvert(char 1 to 8 of theBinBcastAddr, 2, 10) into item 1 of theBcastAddr
put baseconvert(char 9 to 16 of theBinBcastAddr, 2, 10) into item 2 of theBcastAddr
put baseconvert(char 17 to 24 of theBinBcastAddr, 2, 10) into item 3 of theBcastAddr
put baseconvert(char 25 to 32 of theBinBcastAddr, 2, 10) into item 4 of theBcastAddr
-- calculate the last usable IP address
put theBcastAddr into theLastAddr
subtract 1 from item 4 of theLastAddr
-- calculate the number of usable addresses
-- put item 4 of theLastAddr - item 4 of theFirstAddr +1 into theAddrCount
put baseconvert(theBinBcastNodeAddr, 2, 10) -1 into theAddrCount
-- calculate the CIDR notation
put theSubnetAddr & "/" & theCIDRDepth into theCIDRAddr
-- create array
put theIPAddress into ipdata ["ipaddress"]
put theSubnetMask into ipdata ["subnetmask"]
put theSubnetAddr into ipdata ["subnetaddr"]
put theFirstAddr into ipdata ["firstaddr"]
put theBcastAddr into ipdata["bcastaddr"]
put theLastAddr into ipdata ["lastaddr"]
put theCIDRDepth into ipdata ["cidrdepth"]
put theAddrCount into ipdata ["usablecount"]
put theCIDRAddr into ipdata ["cidraddr"]
return ipdata
end IPCalc
More information about the use-livecode
mailing list