How can I determine network and broadcast address from the IP address and subnet mask?

房东的猫 提交于 2019-11-28 16:35:09

Let's write both in binary:

130.45.34.36 = 10000010.00101101.00100010.00100100

255.255.240.0 = 11111111.11111111.11110000.00000000

A bitwise AND between the two would give us the network address:

10000010.00101101.00100010.00100100   (ip address)
AND
11111111.11111111.11110000.00000000   (subnet mask)
=
10000010.00101101.00100000.00000000 = 130.45.32.0 (the resulting network address)

A bitwise OR between the network address and the inverted subnet mask would give us the broadcast address:

10000010.00101101.00100000.00000000   (netadress)
OR
00000000.00000000.00001111.11111111   (inverted subnet mask)
=
10000010.00101101.00101111.11111111 = 130.45.47.255 (broadcast address)
Chitranshu Gupta
var network = calculateNetworkIP("192.168.0.101", "255.255.255.0");

var broadcast = calculateBroadcastIP("192.168.0.101", "255.255.255.0");

function calculateNetworkIP(ipAddress, maskIP){

    var binaryIP = convertIPToBinaryIP(ipAddress);
    var maskBinaryIP = convertIPToBinaryIP(maskIP);

    var binaryNetwork = [];
    for (var j = 0; j < maskBinaryIP.length; j++) {
        binaryNetwork.push(bitwiseAND(binaryIP[j], maskBinaryIP[j]));
    }

    var NetworkIPArr = convertBinaryIPToDecIP(binaryNetwork);

    var NetworkIPStr = "";
    for (var k = 0; k < NetworkIPArr.length; k++) {
        NetworkIPStr += NetworkIPArr[k]+".";
    }
    return NetworkIPStr.slice(0, -1);
}

function calculateBroadcastIP(ipAddress, maskIP){

    var binaryIP = convertIPToBinaryIP(ipAddress);
    var maskBinaryIP = convertIPToBinaryIP(maskIP);
    var invertedMark = [];
    for (var i = 0; i < maskBinaryIP.length; i++) {
        invertedMark.push(invertedBinary(maskBinaryIP[i]));
    }

    var binaryBroadcast = [];
    for (var j = 0; j < maskBinaryIP.length; j++) {
        binaryBroadcast.push(bitwiseOR(binaryIP[j], invertedMark[j]));
    }

    var broadcastIPArr = convertBinaryIPToDecIP(binaryBroadcast);

    var broadcastIPStr = "";
    for (var k = 0; k < broadcastIPArr.length; k++) {
        broadcastIPStr += broadcastIPArr[k]+".";
    }
    return broadcastIPStr.slice(0, -1);
}

function invertedBinary(number){

    var no = number+"";
    var noArr = no.split("");
    var newNo = "";
    for(var i = 0; i < noArr.length; i++){
        if(noArr[i] == "0"){
            newNo += "1";
        }else{
            newNo += "0";
        }
    }
    return newNo;
}

function bitwiseAND(firstBinary, secondBinary){

    var firstArr = [];
    var secondArr = [];
    firstArr = firstBinary.split("");
    secondArr = secondBinary.split("");
    var newAdded = "";
    for(var i = 0; i < firstArr.length; i++){
        if(firstArr[i]+"+"+secondArr[i] == "1+0"){
            newAdded += "0";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+1"){
            newAdded += "0";
        }else if(firstArr[i]+"+"+secondArr[i] == "1+1"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+0"){
            newAdded += "0";
        }
    }
    return newAdded;
}

function bitwiseOR(firstBinary, secondBinary){

    var firstArr = [];
    var secondArr = [];
    firstArr = firstBinary.split("");
    secondArr = secondBinary.split("");
    var newAdded = "";
    for(var i = 0; i < firstArr.length; i++){
        if(firstArr[i]+"+"+secondArr[i] == "1+0"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+1"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "1+1"){
            newAdded += "1";
        }else if(firstArr[i]+"+"+secondArr[i] == "0+0"){
            newAdded += "0";
        }
    }
    return newAdded;
}

function convertBinaryIPToDecIP(binaryIPArr){

    var broadcastIP = [];
    for (var i = 0; i < binaryIPArr.length; i++) {
        broadcastIP.push(parseInt(parseInt(binaryIPArr[i]), 2));
    }
    return broadcastIP;
}

function convertIPToBinaryIP(ipAddress) {

    var ipArr = ipAddress.split(".");
    var binaryIP = [];
    for (var i = 0; i < ipArr.length; i++) {
        var binaryNo = parseInt(ipArr[i]).toString(2);
        if(binaryNo.length == 8){
            binaryIP.push(binaryNo);
        }else{
            var diffNo = 8 - binaryNo.length;
            var createBinary = '';
            for (var j = 0; j < diffNo; j++) {
               createBinary += '0';
            }
            createBinary += binaryNo;
            binaryIP.push(createBinary);
        }
    }
   return binaryIP; 
}
Abhishek Dandegaonkar

Another short cut for broadcast address calculation after getting netwotk address is:

  1. calculate total no of hosts (in this case it is 2^12 = 4096)

  2. Divide it by 256(in this case it is 16) and add the result - 1(in this case 15) in *corresponding octet(in this case second octet i.e. 32+15=47) and make other octet 255

*we can get the corresponding octet by looking at the no of hosts. e.g if the no of hosts are greater than 256 then we have to add it to the 2nd octet of network address and so on

Code example based on Malt's answer:

const
    ipadr = '130.45.34.36',
    subnet = '255.255.240.0',
    ipadrs = ipadr.split('.'),
    subnets = subnet.split('.');

let networks = [],
    broadcasts = [];

for (let i in ipadrs) {
    networks[i] = ipadrs[i] & subnets[i];
}

console.log('netaddress: ', networks.join('.')) // netaddress:  130.45.32.0

for (let i in networks) {
    broadcasts[i] = networks[i] | ~subnets[i] + 256;
}

console.log('broadcast address: ', broadcasts.join('.')) // broadcast address:  130.45.47.255
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!