使用Python腳本生成隨機IP的簡單方法
需求
在某應用中,需要根據(jù)一定的規(guī)則生成隨機的IP地址,規(guī)則類似于192.168.11.0/24這樣的CIDR形式給出。
實現(xiàn)
經(jīng)過艱苦卓絕的調(diào)試,下面的代碼是可以用的:
RANDOM_IP_POOL=['192.168.10.222/0']
def __get_random_ip():
str_ip = RANDOM_IP_POOL[random.randint(0,len(RANDOM_IP_POOL) - 1)]
str_ip_addr = str_ip.split('/')[0]
str_ip_mask = str_ip.split('/')[1]
ip_addr = struct.unpack('>I',socket.inet_aton(str_ip_addr))[0]
mask = 0x0
for i in range(31, 31 - int(str_ip_mask), -1):
mask = mask | ( 1 << i)
ip_addr_min = ip_addr & (mask & 0xffffffff)
ip_addr_max = ip_addr | (~mask & 0xffffffff)
return socket.inet_ntoa(struct.pack('>I', random.randint(ip_addr_min, ip_addr_max)))
生成的結(jié)果如:
192.168.10.175 192.168.10.29 192.168.10.30 192.168.10.207 192.168.10.248 192.168.10.145 192.168.10.168 192.168.10.223 192.168.10.66 192.168.10.138 192.168.10.99 192.168.10.136 192.168.10.147 192.168.10.244 192.168.10.73 192.168.10.180
備注
(mask & 0xffffffff)這一用法,目的在于消除mask上32位以上的高位數(shù)據(jù)。由于mask是IPv4的掩碼,所以不需要32位以上的數(shù)據(jù)。這一問題在mask取反之后比較明顯。由于mask是一個32位以上的數(shù)(有可能是64位),取反之后,高位全部為1,計算的結(jié)果就不正確了。因此,在使用之前,需要利用(mask & 0xffffffff)清除高位。
供各位讀者參考。
相關文章
分位數(shù)回歸模型quantile regeression應用詳解及示例教程
這篇文章主要為大家介紹了介紹了分位數(shù)回歸quantile regeression的概念詳解及代碼示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Python開發(fā)如何在ubuntu 15.10 上配置vim
這篇文章主要介紹了Python開發(fā)如何在ubuntu 15.10 上配置vim 的相關資料,需要的朋友可以參考下2016-01-01
Selenium(Python web測試工具)基本用法詳解
這篇文章主要介紹了Selenium(Python web測試工具)基本用法,結(jié)合實例形式分析了Selenium的基本安裝、簡單使用方法及相關操作技巧,需要的朋友可以參考下2018-08-08

