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