Thanks Bob - that looks really useful.

You do need one tiny tweak - the CIDR calculations are slightly off, because of the "."s in theBinSubnetMask.
I added the line
  replace "." with empty in theBinSubnetMask
just before
   put offset("0", theBinSubnetMask) into theFirstNodeChar

to get the right answer (e.g. 24 instead of 27 in 192.168.1.1 255.255.255.0)

Thanks again
-- Alex.


On 09/01/2015 00:44, Bob Sneidar wrote:
Hi all.

It’s not often I get a chance to give something back to the LC community, so 
here is my contribution. I put together an IP calculator function which when 
passed any IP address and subnet mask returns an array of pretty much every 
value you want to know about your network. It may also help others who don’t 
know about how subnets are calculated to understand it a bit better. I didn’t 
do any error checking, because frankly there are a lot of bad values you can 
pass, including for example passing 0 for the first octet of the ip address or 
subnet, or passing the broadcast address as the IP address etc.

I will add error checking later. so without further ado, here you go!
function IPCalc theIPAddress, theSubnetMask
    set the itemdelimiter to "."
-- initial setup
    set the numberFormat to "00000000"
-- 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 item whichOctet of theBinIPAddress
       add 0 to item whichOctet of theBinIPAddress
    end repeat
-- convert the subnet mask to binary
    put 0 into whichOctet
    repeat for each item theOctet in theSubnetMask
       add 1 to whichOctet
       put baseConvert(theOctet, 10, 2) into item whichOctet of theBinSubnetMask
       add 0 to item whichOctet of theBinSubnetMask
    end repeat
-- calculate the binary subnet address
    put offset("0", theBinSubnetMask) into theFirstNodeChar
    put theFirstNodeChar -1 into theCIDRDepth
    put char 1 to theFirstNodeChar -1 of theBinIPAddress into theBinNetworkAddr
    put char theFirstNodeChar 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 0 into whichOctet
    repeat for each item theOctet in theBinSubnetAddr
       add 1 to whichOctet
       put baseconvert(theOctet, 2, 10) into item whichOctet of theSubnetAddr
    end repeat
-- 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 0 into whichOctet
    repeat for each item theOctet in theBinBcastAddr
       add 1 to whichOctet
       put baseConvert(theOctet, 2 ,10) into item WhichOctet of theBcastAddr
    end repeat
-- 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
-- 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 theCIDRAddr into ipdata ["cidrdepth"]
    put theAddrCount into ipdata ["usablecount"]
    put theCIDRAddr into ipdata ["cidraddr"]
    return ipdata
end IPCalc

Bob S


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to