免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4281 | 回复: 9
打印 上一主题 下一主题

ip地址转换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-13 10:42 |只看该作者 |倒序浏览
222.240.0.0 222.249.255.255
类似这样的IP范围,我想写成222.240.0.0/14 这样的形式

想法是把上面IP写成2进制形式,然后与一下。

现在问题是如何222.240.0.0这样的形式转换成二进制形式

论坛徽章:
0
2 [报告]
发表于 2009-07-13 11:14 |只看该作者
去下个ipcalc来。perl写的,鄙人看不懂,但好用。

论坛徽章:
0
3 [报告]
发表于 2009-07-13 11:16 |只看该作者
给你地址:http://jodies.de/ipcalc

论坛徽章:
0
4 [报告]
发表于 2009-07-13 11:19 |只看该作者
原帖由 lucash 于 2009-7-13 11:14 发表
去下个ipcalc来。perl写的,鄙人看不懂,但好用。



先用着这个,谢谢老兄了,挺好用的还是

论坛徽章:
0
5 [报告]
发表于 2009-07-13 11:21 |只看该作者
bc可以
echo "obase=2;222" |bc

论坛徽章:
0
6 [报告]
发表于 2009-07-13 12:43 |只看该作者
原帖由 ywlscpl 于 2009-7-13 11:21 发表
bc可以
echo "obase=2;222" |bc


但是bc得问题我不能一下子222.222.22.0这样输入,我还得分割。楼上说的那个不错

论坛徽章:
0
7 [报告]
发表于 2013-08-07 00:28 |只看该作者
本帖最后由 zhoufengjie848 于 2013-08-07 00:38 编辑

我写了一个,希望能够帮到你【在centos 5.8下面写的】:

=========start=========

#!/bin/bash

ip="1.2.3.4"

function ipnum10to2(){
   num10=$1
   num2=`echo "obase=2;$num10"|bc`
   num2len=`echo $num2|wc -c`
   while [ $num2len -le 8 ]
   do
      num2="0"$num2
      num2len=`echo $num2|wc -c`
   done
   echo $num2
}

function ip10to2(){
   ip=$1
   read -a ipsub <<< ${ip//./ };
   for num in {0..3}
   do
      ip2=$ip2`ipnum10to2 ${ipsub[$num]}`
   done
   echo $ip2
}

result=`ip10to2 $ip`
echo $result

=========stop=========

输出结果如:
00000001000000100000001100000100
如果不想要全位的话,可以把上面的while函数去掉;
对于bc行,也可以用dc来实现,
比如:echo -n 数字 进制 o p | dc
样例:
[fengjie.zhou@TYUMEN-rpmmake tmp]$ echo -n 4 2 o p | dc   
100

论坛徽章:
2
摩羯座
日期:2014-09-10 16:52:2620周年集字徽章-周	
日期:2022-02-09 19:00:27
8 [报告]
发表于 2013-08-07 01:29 |只看该作者
回复 7# zhoufengjie848


    要是加个注释就好了, 小弟才学几天, 有的看不懂

论坛徽章:
0
9 [报告]
发表于 2013-08-11 01:47 |只看该作者
回复 8# ruifeng_


#!/bin/bash

ip="1.2.3.4"  #输入,可以通过参数输入,以$1接收

function ipnum10to2(){  #10进制转换2进制函数
   num10=$1               #接收此函数的第一个输入值
   num2=`echo "obase=2;$num10"|bc`  #将输入值转换成2进制
   num2len=`echo $num2|wc -c`    #统计一下2进制长度【为了cidr的8位长度做计算】
   while [ $num2len -le 8 ]   #将字符补齐8位
   do
      num2="0"$num2
      num2len=`echo $num2|wc -c`
   done
   echo $num2
}

function ip10to2(){   #十进制转二进制主函数
   ip=$1  #接收输入的ip地址
   read -a ipsub <<< ${ip//./ };  #将ip地址以.分割放到ipsub数值里面
   for num in {0..3}
   do
      ip2=$ip2`ipnum10to2 ${ipsub[$num]}`  #依次取数组0,1,2,3四个值,并调用ipnum10to2函数转换成二进制,并合并到一串
   done
   echo $ip2  #输出转换结果,之所以没有用return,是因为return会再次把二进制做转换;
}

result=`ip10to2 $ip`  #触发ip10to2函数,并把结果输入给result变量
echo $result  #输出结果

论坛徽章:
2
摩羯座
日期:2014-09-10 16:52:2620周年集字徽章-周	
日期:2022-02-09 19:00:27
10 [报告]
发表于 2013-08-11 17:32 |只看该作者
回复 9# zhoufengjie848


    谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP