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 条评论
登录 后参与评论

相关文章

来自专栏xcywt

《程序员的自我修养》第三章学习笔记

1, 编译器编译源代码生成的文件叫做目标文件。 从结构上说,是编译后的可执行文件,只不过还没有经过链接 3.1 目标文件的格式 1,可执行文件的格式: Wind...

1886
来自专栏破晓之歌

ip地址相关基础 原

IP 32位的地址通常表示为四个10进制的数,每个证书对应一个字节,成为点分十进制法(Dotted decimal notation)

561
来自专栏mySoul

微信小程序继续入坑指南

上方完成了一次列表渲染,其中index为默认的遍历到的数组的小标,从0开始,item为当前遍历到的数组对应下标的元素。

738
来自专栏ImportSource

非阻塞编程核心设计之Selector

1. 铺垫 在本文中,我们将探讨Java NIO的Selector组件。 Selector是一个定义在java.nio.channels包中的抽象类。 选择器(...

2879
来自专栏tkokof 的技术,小趣及杂念

HGE系列之七 管中窥豹(图形界面)

这次的HGE源码之旅,让我们来看看HGE的图形用户界面(GUI)的实现,话说电脑技术发展至今,当年轰动一时的图形用户界面,而今早已司空见惯,想来不得不感叹一下...

741
来自专栏wym

Windows创建窗口详解+代码---十天教会你俄罗斯方块

代码地址:https://blog.csdn.net/qq_41603898/article/details/80968266

611
来自专栏架构之路

正则表达式中 ? 符号的一些用法

1. 如\d?,代表出现0个或1个数字 2. 如\d+?,代表最小贪婪,满足\d+的最小匹配,也就是只出现一个数字最好 3. (?<name> expressi...

2494
来自专栏BinarySec

ISCC中pwn200 shell无法启动原因详解

0x00 背景 一朋友问到在pwn中,gdb调试看到了systemm("/bin/sh")了,但是shell确无法启动。于是我详细看了一下这个题目,发现自己的e...

4155
来自专栏程序员互动联盟

【编程基础】简单理解大小端那些事儿

什么是计算机大小端?简单来说,大小端(Endian)是指数据存储或者传输时的字节序,大小端分大端和小端。 所谓大端(Big-Endian)模式,是指数据的低位(...

2679
来自专栏Java Web

初学Java Web(6)——JSP学习总结

为什么要学习 JSP Servlet 的短板: Servlet 的出现,是为了解决动态输出网页的问题。 虽然这样做目的能达到,但是存在一些缺陷: 在 Servl...

3597

扫码关注云+社区