LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1174|回复: 5

在BASH中如何实现10进制到2进制的转换?

[复制链接]
发表于 2003-5-10 13:13:30 | 显示全部楼层 |阅读模式
我正写了一个KORN SHELL的脚本,就是把输入的10进制的IP ADDRESS,转换为点分的2进制,然后求子网掩码,在KSH中很容易实现10-->2进制的转换,但是用BASH如何实现?
 楼主| 发表于 2003-5-10 18:33:39 | 显示全部楼层
还有一个问题:
javalee//home/javalee/lx>ipvt 211 150 189 9
IP Address:[211.150.189.9]  [11010011.10010110.10111101.1001]
那个1001前面如何自动补齐0变成用8位表示?即,00001001?
多谢!
 楼主| 发表于 2003-5-10 19:50:18 | 显示全部楼层
我想出来个用perl处理的方法,请指教;)
  1. javalee//home/javalee/lx>cat ipvt
  2. #!/bin/ksh
  3. #将十进制IP地址转换成二进制的脚本
  4. #begin
  5. (($# !=4)) && { print "\aExample:ipvt 192 168 0 1[Enter]" ; exit 1; }
  6. if [[ $1<224 && $2<256 ]]
  7.     then
  8.         integer -i10 var1=$1
  9.         integer -i10 var2=$2
  10.         integer -i10 var3=$3
  11.         integer -i10 var4=$4
  12.         typeset -i2 var1
  13.         typeset -i2 var2
  14.         typeset -i2 var3
  15.         typeset -i2 var4
  16.         varlen1=$(print $var1|sed 's/2#//')
  17.         integer len1=${#varlen1}
  18.         ((n1=8-$len1))
  19.         v1=$(print $(perl -e "print 0 x $n1")$varlen1)
  20.         varlen2=$(print $var2|sed 's/2#//')
  21.         integer len2=${#varlen2}
  22.         ((n2=8-$len2))
  23.         v2=$(print $(perl -e "print 0 x $n2")$varlen2)
  24.         varlen3=$(print $var3|sed 's/2#//')
  25.         integer len3=${#varlen3}
  26.         ((n3=8-$len3))
  27.         v3=$(print $(perl -e "print 0 x $n3")$varlen3)
  28.         varlen4=$(print $var4|sed 's/2#//')
  29.         integer len4=${#varlen4}
  30.         ((n4=8-$len4))
  31.         v4=$(print $(perl -e "print 0 x $n4")$varlen4)
  32.         print -n "IP Address:[$1.$2.$3.$4]  "
  33.         print "[$v1.$v2.$v3.$v4]"
  34.     else
  35.         print "Wrong number!\aInput again..."
  36. fi
  37. #over
复制代码
是不是很臃肿,我也觉得,不知道哪位兄弟替我瘦瘦身?;)
测试我当前上线的IP:
javalee//home/javalee/lx>ipvt 211 150 182 28
IP Address:[211.150.182.28]  [11010011.10010110.10110110.00011100]
javalee//home/javalee/lx>

 楼主| 发表于 2003-5-10 20:00:38 | 显示全部楼层
接着再作求子网掩码的那部分吧~~~请兄弟们指点;(
发表于 2003-5-10 21:13:49 | 显示全部楼层
bash在数学运算方面很弱,好象没有专门内置的二进制转换功能,用除2法写一个转换函数是可能的(不过会慢得很),也许没有这个必要,应该有可用的外部命令。

我还没看perl呢,呵呵。我觉得可以写一个紧凑的专门的十/二进制转换函数,然后通过分析IP值,调它来算就行了。不过这在其实效率上和你的原代码应该没多大差别,你的代码只是在视觉上臃肿而以。
你还可以直接去CPAN(http://www.cpan.org/)找找别人写好的模块,在代码中调用就行了。;)
 楼主| 发表于 2003-5-10 23:35:58 | 显示全部楼层
谢谢LY00兄,我也觉得KSH在数学方面的作为也许比BASH强,(我喜欢KSH)!
DIY是咱们追求的乐趣,实在自己写不出来的时候再调用别人的吧~~,你说呢?!;)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表