Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396869
  • 博文数量: 119
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 1061
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-14 12:48
个人简介

醉心于技术。

文章分类

全部博文(119)

文章存档

2018年(34)

2016年(1)

2015年(4)

2014年(6)

2013年(74)

我的朋友

分类: 系统运维

2013-09-01 15:20:00

知道子网的IP和NETMASK,计算出这个子网可以包含多少台计算机?

1. 子网IP,NETMASK,子网广播IP。子网容量。
知道这三个钟任意两个,都可以得到第三个值,知道这三个值,就可以知道第四个了。例如:192.168.1.22/25。前面是子网IP地址,25是子网掩码,得到所以把22换算成二进制(00010110),其中第一位被分到网络地址里了。剩下的位数改为1,即为子网广播地址(192.168.1.127)。22~127之间且不包括两边值得数量就是计算机数量了。

2. bc对十进制和二进制进行。二进制结果如果不足八位左边补0(IP要求)
  1. [huang@huang ~]$ echo 'obase=2; 22' | bc
  2. 10110
  3. [huang@huang ~]$ echo 'ibase=2; 111' | bc
  4. 7
注意:这里不必再加ibase=10/obase=10,因为系统默认ibase,obase都是十进制。否则会出错!

3. python也可以达到相同功能。使用内置函数int(),bin(),python -c 把二进制和十进制换算。但是要注意bin(),返回前两个字节是0b,和输出结果没有关系。所以最好剔除。
  1. [huang@huang ~]$ python -c "print int('01111111',2);"
  2. 127
  3. [huang@huang ~]$ python -c 'print bin(22)' | cut -d'b' -f2
  4. 10110

4.  用bash写的一个的脚本实例:
  1. #!/bin/bash

  2. # return the number of PC in subnet according to subnet IP and NETMASK
  3. # sample: 192.168.1.22/26

  4. # check the format of $1
  5. usage() {
  6.         echo 'format 192.168.1.1/25'
  7.         exit 1
  8. }

  9. # check param
  10. if [ "$#" == 0 ];then
  11.         usage
  12. elif [ "$#" == 1 ];then
  13.         echo $1 | grep -qxP '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{2}' || usage
  14. else
  15.         usage
  16. fi

  17. # calculate the number of PC the subnet can contain
  18. nmask=`echo $1 | cut -d\/ -f2`
  19. nip=`echo $1 | cut -d\/ -f1`

  20. # convert 10 base to 2 base
  21. nbin=''
  22. for i in `echo $nip | cut -d. -f1,2,3,4 --output-delimiter=' '`
  23. do
  24.         ip_part_bin=`echo "obase=2;$i" | bc | tr -d '\n'`
  25.         num=`echo -n $ip_part_bin | wc -c`

  26.         # add 0 if the count of ip_part is less than 8
  27.         if [ "$num" -lt 8 ];then
  28.             let theless=8-"$num"
  29.             while [ "$num" -lt 8 ]
  30.             do
  31.                 ip_part_bin=`echo -n "$ip_part_bin" | sed 's/^/0/'`
  32.                 let num+=1
  33.             done
  34.         fi
  35.         nbin+="$ip_part_bin"
  36. done

  37. echo $nbin


输出值是:
  1. [nanhuang@nanhuang ~]$ bash binaryip.sh '10.10.10.0/26'
  2. 00001010000010100000101000000000


阅读(5026) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

niao59292013-09-02 10:03:59

PYTHON自由软件世界里最好的玩具之一。GO同样值得学习和研究。