Chinaunix

标题: 恳求一IP地址段转换算法函数 [打印本页]

作者: ability    时间: 2006-04-21 23:32
标题: 恳求一IP地址段转换算法函数
恳求一IP地址段转换算法函数(SHELL调用)
我的程序太差,麻烦高人指点,谢谢!

函数的参数是这样的202.101.0.0-202.102.255.255格式.
要求是这样的.

将202.101.0.0-202.102.255.255这样的地址范围转换成202.101.0.0/15这样的带掩码的网段.
过程是这样的.
先202.101.0.0-202.102.255.255
第一位进行减202(后面)-202比较等于0记录A,
第二位进行减102(后面)-101比较等于1记录B,
第三位进行减255(后面)-0等于255记录C,
第四位进行减255(后面)-0等于255记录D,
然后将(A+1)(B+1)(C+1)(D+1)-2再转换成2进制,再读出一共多少位,再用32 -位数,就出来了后面的15
谢谢!

[ 本帖最后由 ability 于 2006-4-21 23:34 编辑 ]
作者: zmkun    时间: 2006-04-22 00:35
感觉有点问题

202.101.0.0/15的IP段应该是202.100.0.0-202.101.255.255

这两个IP段没办法用掩码表示

202.100.0.0/15=202.101.0.0/15

能不能把具体的例子举出来呢?

还有,掩码中如果前面那一位不是255,接下去的那几位肯定是0,比如255.254.0.0,254.0.0.0,所以下面几位不用加于判断了
作者: ability    时间: 2006-04-22 01:05
原帖由 zmkun 于 2006-4-22 00:35 发表
感觉有点问题

202.101.0.0/15的IP段应该是202.100.0.0-202.101.255.255

这两个IP段没办法用掩码表示

202.100.0.0/15=202.101.0.0/15

能不能把具体的例子举出来呢?

还有,掩码中如果前面那一位不是 ...

谢谢!
举个例子大概说明程序的意思,没有精确去算这个是否对,错了还请包含,我的目的是求一个函数的写法,麻烦SHELL高手指教一下谢谢
作者: shitou9000    时间: 2006-04-22 09:27
  1. awk -F "[.-]" 'BEGIN{
  2. i=1;a=1
  3. }
  4. {
  5. while(i<=4){a*=$(i+4)-$i+1;i++}
  6. }
  7. END{
  8. f=sprintf("%o",a-2)
  9. while(f/10>1){w+=3;f/=10}
  10. if(f>4)w+=3;else {if(f>2)w+=2;else w+=1}
  11. print $0"/"32-w
  12. }' bb
复制代码

写的有点乱。
作者: ability    时间: 2006-04-22 22:49
谢谢!
作者: 寂寞烈火    时间: 2006-04-23 00:36
我记得netman的精华里有类似的解决方案
作者: 丫头19845    时间: 2009-05-20 15:28
标题: 回复 #6 寂寞烈火 的帖子
他俩说的不是一回事
作者: tenglitrr    时间: 2009-05-20 17:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: mixednuts    时间: 2009-05-20 17:57
我不做数通很多年,你的算法太麻烦,我用B类IP地址给你举个例子,你自己修改一下我觉得行

#! /bin/bash
function cal
{
        ip1=$(echo $1|cut -d. -f2)
        ip2=$(echo $2|cut -d. -f2)
        value=$(($ip2-$ip1))
        case $value in
        1)
        echo $1"/"15
        ;;
        3)
        echo $2"/"14
        ;;
        *)
        echo "error"
        esac
}
cal $1 $2


运行结果
-bash-3.2$ ./liang.sh 202.101.0.0 202.102.255.255
202.101.0.0/15




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2