IP 段範圍區間或者掩碼網段地址解析成實際單個 IP

概述

兩種狀況,一種給的是IP 範圍,給了一個區間例如
參考:http://www.cnblogs.com/amaoxi...html

64.233.196.0-64.233.196.25#將這個範圍內的IP 所有解析出來

另外一種狀況就是給了一個掩碼地址,例如python

192.168.1.0/24
或者192.168.1.0 255.255.255.0
#將這個掩碼範圍內的全部 IP 地址解析輸出出來

第一種狀況範圍

#coding:utf-8

def ip2num(ip):
    ips = [int(x) for x in ip.split('.')]
    return ips[0]<< 24 | ips[1]<< 16 | ips[2] << 8 | ips[3]

def num2ip (num):
    return '%s.%s.%s.%s' % ((num >> 24) & 0xff, (num >> 16) & 0xff, (num >> 8) & 0xff, (num & 0xff))
    #return '%s.%s.%s.%s' % ((num & 0xff000000)>>24,(num & 0x00ff0000)>>16,(num & 0x00000ff00)>>8,num & 0x000000ff)


def gen_ip(ip):
    start ,end = [ip2num(x) for x in ip.split('-')]
    return [num2ip(num) for num in range(start,end+1) if num & 0xff]
print gen_ip(64.233.196.0-64.233.196.25)

輸入結果爲:
['64.233.196.22', '64.233.196.23', '64.233.196.24', '64.233.196.25', '64.233.196.26', '64.233.196.27', '64.233.196.28', '64.233.196.29']

利用0xff 把多生成的ip屏蔽掉
最後一句中 if num & 0xff 做用是過濾掉 最後一段爲 0 的IP

第二種狀況掩碼

利用 IPy 這個 python 自帶的模塊網絡

from IPy import IP
ip = IP('192.168.0.0/24') 
print ip.len() 
for x in ip: 
    print(x)
反向解析名稱、IP類型、IP轉換等

>>> ip = IP('192.168.1.20')
>>> ip.reverseNames()               #反向解析地址格式
['20.1.168.192.in-addr.arpa.']
>>> ip.iptype()                     #私網類型
'PRIVATE'
>>> IP('8.8.8.8').iptype()          #公網類型
'PUBLIC'
>>> IP('8.8.8.8').int()             #轉換爲整型格式
134744072
>>> IP('8.8.8.8').strHex()          #轉換爲十六進制格式
'0x8080808'
>>> IP('8.8.8.8').strBin()          #轉換成二進制格式
'00001000000010000000100000001000'
>>> print IP('0x8080808')           #十六進制轉換爲IP格式
8.8.8.8
>>> print IP(134744072)             #整型格式轉換爲IP格式
8.8.8.8
IP方法也支持網絡地址的轉換,例如根據IP和掩碼產生網段格式

>>> print (IP('192.168.1.0').make_net('255.255.255.0'))
192.168.1.0/24
>>> print (IP('192.168.1.0/255.255.255.0',make_net=True))
192.168.1.0/24
>>> print (IP('192.168.1.0-192.168.1.255',make_net=True))
192.168.1.0/24
經過strNormal方法指定不一樣wantprefixlen參數值以定製不一樣輸出類型的網段,輸出類型爲字符串

>>> IP('192.168.1.0/24').strNormal(0)   #無返回
'192.168.1.0'
>>> IP('192.168.1.0/24').strNormal(1)   #prefix格式
'192.168.1.0/24'
>>> IP('192.168.1.0/24').strNormal(2)   #decimalnetmask格式
'192.168.1.0/255.255.255.0'
>>> IP('192.168.1.0/24').strNormal(3)   #lastIP格式
'192.168.1.0-192.168.1.255'

ps:

使用python將IP段範圍轉換成CIDR工具

由於最近在整理用於某些工具使用的IP段,像一些IP範圍如:64.233.56.37-64.233.56.215,某些軟件不支持,只支持像:64.233.56.37/26這樣的CIDR格式,因而就在網上找了一下轉換的方法,還真找到了不過是外語,這裏簡單記錄下須要的工具。插件

首先要準備一個python環境,安裝netaddr插件,本人用的是提取的輕量級python環境,因此直接下載官網的源碼,解壓後找到netaddr文件夾複製到python環境目錄的lib文件夾裏便可。code

使用方法:

# 首先引入netaddr
import netaddr

# 肯定起始和結尾IP,不管多複雜均可以轉換
startip = '64.233.56.37'
endip = '64.233.56.215'
cidrs = netaddr.iprange_to_cidrs(startip, endip)
for k, v in enumerate(cidrs):
    iplist = v
    print iplist
運行後輸出結果:

64.233.56.37/32
64.233.56.38/31
64.233.56.40/29
64.233.56.48/28
64.233.56.64/26
64.233.56.128/26
64.233.56.192/28
64.233.56.208/29
相關文章
相關標籤/搜索