Python CIDR地址块算法

V站笔记

最近写扫描器有个模块需要把CIDR地址块(类似与192.168.1.1/24)之类的地址解析成IP地址。

写了一会已经可以把地址快的首地址二进制和尾地址二进制读取出来,剩下就是循环二进制解码成IP就行了。

但是解码二进制又要涉及到好多IP转换,看了下寻风的代码,有现成的CIDR转换代码。就贴上来记录一下。

#!/usr/bin/env python# -*- encoding: utf-8 -*-   def stringxor(str1, str2):    orxstr = ""    for i in range(0, len(str1)):        rst = int(str1[i]) & int(str2[i])        orxstr = orxstr + str(rst)    return orxstr  def bin2dec(string_num):    return str(int(string_num, 2))  def getip(ip, type):    result = ''    for i in range(4):        item = bin2dec(ip[0:8])        if i == 3:            if type == 0:                item = str(int(item) + 1)            else:                item = str(int(item) - 1)        result = result + item + '.'        ip = ip[8:]    return result.strip('.') def CIDR(input):    try:        ip = input.split('/')[0]        pos = int(input.split('/')[1])        ipstr = ''        for i in ip.split('.'):            ipstr = ipstr + bin(int(i)).replace('0b', '').zfill(8)        pstr = '1' * pos + '0' * (32 - pos)        res = stringxor(ipstr, pstr)        _ip = getip(res, 0), getip(res[0:pos] + '1' * (32 - pos), 1)        return _ip[0] + "-" + _ip[1]    except:        return input  def get_ip_list(ip):    ip_list_tmp = []    iptonum = lambda x: sum([256 ** j * int(i) for j, i in enumerate(x.split('.')[::-1])])    numtoip = lambda x: '.'.join([str(x / (256 ** i) % 256) for i in range(3, -1, -1)])    if '-' in ip:        ip_range = ip.split('-')        ip_start = long(iptonum(ip_range[0]))        ip_end = long(iptonum(ip_range[1]))        ip_count = ip_end - ip_start        if ip_count >= 0 and ip_count <= 655360:            for ip_num in range(ip_start, ip_end + 1):                ip_list_tmp.append(numtoip(ip_num))        else:            print 'IP format error'    else:        ip_split = ip.split('.')        net = len(ip_split)        if net == 2:            for b in range(1, 255):                for c in range(1, 255):                    ip = "%s.%s.%d.%d" % (ip_split[0], ip_split[1], b, c)                    ip_list_tmp.append(ip)        elif net == 3:            for c in range(1, 255):                ip = "%s.%s.%s.%d" % (ip_split[0], ip_split[1], ip_split[2], c)                ip_list_tmp.append(ip)        elif net == 4:            ip_list_tmp.append(ip)        else:            print "IP format error"    return ip_list_tmp ip = "255.168.2.1/21"print get_ip_list(CIDR(ip))

原文链接:https://24bp.cn

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

《Linux 性能及调优指南》3.2 CPU瓶颈

对服务器来说主要的角色就是应用服务器或数据库服务器,CPU作为关键资源经常成为性能瓶颈的根源。CPU使用率高并不总是意味着CPU工作繁忙,它有可能是正在等待其他...

41690
来自专栏Java后端技术

解决Eclipse里Maven工程报 An error occurred while filtering resources错误

这几天被maven的单元测试折腾死了,以为是自己的eclipse有问题呢,今天早上来了又发现eclipse报了一个很奇怪的错误:An error occurre...

12720
来自专栏服务端技术杂谈

微服务系列-架构

模块即服务; 微服务使用库,库定义成内存里面的调用,微服务定义成web请求或远程调用; 独立可部署; 接口调用; 缺点是远程调用比本地重很多; 按业务逻辑进行分...

32070
来自专栏知识分享

11-云端安装MQTT服务器

34340
来自专栏网商云

腾讯云cvm--linux结合腾讯云企业邮箱配置mailx

新账号关联我们公司购买腾讯云产品,有优惠哦!联系电话:13430587834(微信同号)

52240
来自专栏Coding01

svn + 钉钉机器人制作简单的代码跟踪系统

我在很早之前使用一个第三方的支付聚合平台 ping++ (https://www.pingxx.com)

17710
来自专栏腾讯移动品质中心TMQ的专栏

【UTP自动化测试平台系列之三】用例管理

导语 UTP自动化测试平台是TMQ的一个联合项目,目的是方便各项目测试人员更好地开展自动化测试建设工作,减少重复平台建设的成本,提高产品的自动化测试效率。 背景...

51780
来自专栏黑泽君的专栏

GitHub上如何创建小组?

比如:在谷歌工作,有开发小组、营销小组、运营小组,     在我所在的开发小组里面有三个人,我们需要访问相同的代码仓库,并且经常需要互相交流。     这个...

20010
来自专栏容器云生态

shel脚本批量添加用户,首次登陆强制修改密码

企业里常用到脚本来批量管理很多用户,这些也可以理解为自动化管理。为企业之后自动运维部署做准备。 #!/bin/bash #description:userad...

27350
来自专栏Java技术栈

一张图告诉你为什么是服务网关。

网关服务是单一访问点,并充当多项服务的代理。服务网关启用了跨所有服务的路由转发、过滤和公共处理等。 在微服务实践中远不止这点功能,它可以做到统一接入、流量管控、...

34780

扫码关注云+社区

领取腾讯云代金券