放荡的人生|用Python开发一个交互式网络和IP地址计算器
今天从Python的角度来聊下计算机网络这行基础中的基础的话题:网络和IP地址计算(注:本文里的IP指的是IPv4 , 不涉及IPv6) 。 相信几乎每位网工读者在平时的工作和学习中都用过类似下图的在线网络和IP地址计算器吧:
这类前人(或者说码农们)造出的轮子的确很好用 , 但是很少有网工明白它们背后的工作原理(也就是代码是怎么写出来的) 。 作为有志成为NetDevOps Engineer的我们有必要深入的从代码的角度来学习一下 , 不妨自己也用Python从零写一个交互式的网络和IP地址计算器 , 重新造一遍轮子 , 一来可以温故知新 , 二来可以帮助我们更深入的了解二进制和十进制在Python里是怎么玩的 。 该交互式计算器的作用是让用户输入一个合法的IP地址及子网掩码 , 然后根据用户输入的信息自动给出用户查询的网段的网络IP、广播IP、网段内可用的IP地址数、反掩码以及用户输入的子网掩码对应的“/”格式的掩码位(比如用户输入的掩码是255.255.128.0 , 计算器会自动在结果中给出/17的掩码位) 。
因为是所有网工必须掌握的基本功 , 为了节约篇幅 , 下面我只高度概括一下网络和IP地址计算的理论要点 , 我们重点要关注的是如何在Python中实现它们(所有演示我都将在解释器里实时完成 , 让读者更清楚的看到十进制和二进制的相互转换在Python中是怎样完成的)大致可以归纳为A,B,C,D,E总共5个点 , 分述如下:
A.我们知道任何一个合法的IP地址和子网掩码都可以用32位的二进制(binary)表示 , 这32位二进制又被分为4个八位位组(octet) , 比如192.168.1.1用二进制可以写成11000000.10101000.00000001.00000001 , 这个转换步骤在Python中实现的方法如下:
- 这里我们用字符串自带的split()函数将ip地址(字符串‘192.168.1.1')转换成列表ip_octets , 然后创建一个空列表ip_octets_binary , 随后用for循环遍历ip_octets里的元素 , 将它们每个用bin()函数转换成二进制形式 , 然后一一写入刚才创建的空列表ip_octets_binary里面 。
- 关于binary_octet = bin(int(octet)).lstrip('0b') , bin()只能将数据类型为整数的十进制数转换成二进制 , 因此这里我们要先将字符串用int()转换成整数后再来调用bin()函数 , 而bin()函数本身会在转化后的二进制数字前面加上'0b' , 我们必须调用lstrip('0b')将其拿掉 , 演示如下:
- 再来看ip_octets_binary.append(binary_octet.zfill(8))中的zfill(8) , 它的作用是自动帮我们填充八位数的二进制数 , 什么意思呢?比如我们有个IP地址192.168.0.1 , 它的第三个八位组为0 , 写成二进制的话应该为00000000 , 如果我们将0用bin()转换成二进制后会怎么样呢?演示如下:
推荐阅读
- 下个10年,Go能取代Python成为开发者的首选语言吗?
- 印军|高原边境出大事了!印军一支巡逻队连人带车掉下悬崖,无一人生还
- 三国打一手烂牌,还能登上人生巅峰,贾诩简直就是张绣的“人生导师”
- 薄情娱乐咖|还能登上人生巅峰,贾诩简直就是张绣的“人生导师”,打一手烂牌
- 风味|但顺序对了...这酒很渣
- 品品科技|已成2亿人生活方式,平台化的菜鸟裹裹
- 财经无忌|大起大落的人生太刺激了,中国各省份首富简史
- Buy遍全球1004|每日一葩:人生中第一个差评竟是因为绿色赠品?
- 淘宝人生|淘宝人生:本周除了返场还会更新什么呢?一起猜猜吧!
- 身份证|“上户前被父亲索要6万6”续:24岁女孩拿到人生第一张正式身份证
