点击上方蓝字 ● 关注捷创源科技

自己用Python封装的一个计算IP地址的类,python编写IP地址计算第一个可用IP地址、最后一个可用IP地址、网络号、广播地址、主机数的源代码。
先看运行效果:
"C:\Program Files\Python38\python.exe" E:/PythonSourceCode/IP/main.py你输入的子网:192.168.10.1/24子网掩码:255.255.255.0网络号:192.168.10.0可用主机数:254第一个可用IP:192.168.10.1最后一个可用IP:192.168.10.254广播IP:192.168.10.255192.168.10.1192.168.10.2192.168.10.3192.168.10.4192.168.10.5192.168.10.6192.168.10.7192.168.10.8192.168.10.9192.168.10.10192.168.10.11192.168.10.12192.168.10.13192.168.10.14192.168.10.15192.168.10.16192.168.10.17192.168.10.18192.168.10.19192.168.10.20192.168.10.21192.168.10.22192.168.10.23192.168.10.24192.168.10.25192.168.10.26192.168.10.27192.168.10.28192.168.10.29192.168.10.30192.168.10.31192.168.10.32192.168.10.33192.168.10.34192.168.10.35192.168.10.36192.168.10.37192.168.10.38192.168.10.39192.168.10.40192.168.10.41192.168.10.42192.168.10.43192.168.10.44192.168.10.45192.168.10.46192.168.10.47192.168.10.48192.168.10.49192.168.10.50192.168.10.51192.168.10.52192.168.10.53192.168.10.54192.168.10.55192.168.10.56192.168.10.57192.168.10.58192.168.10.59192.168.10.60192.168.10.61192.168.10.62192.168.10.63192.168.10.64192.168.10.65192.168.10.66192.168.10.67192.168.10.68192.168.10.69192.168.10.70192.168.10.71192.168.10.72192.168.10.73192.168.10.74192.168.10.75192.168.10.76192.168.10.77192.168.10.78192.168.10.79192.168.10.80192.168.10.81192.168.10.82192.168.10.83192.168.10.84192.168.10.85192.168.10.86192.168.10.87192.168.10.88192.168.10.89192.168.10.90192.168.10.91192.168.10.92192.168.10.93192.168.10.94192.168.10.95192.168.10.96192.168.10.97192.168.10.98192.168.10.99192.168.10.100192.168.10.101192.168.10.102192.168.10.103192.168.10.104192.168.10.105192.168.10.106192.168.10.107192.168.10.108192.168.10.109192.168.10.110192.168.10.111192.168.10.112192.168.10.113192.168.10.114192.168.10.115192.168.10.116192.168.10.117192.168.10.118192.168.10.119192.168.10.120192.168.10.121192.168.10.122192.168.10.123192.168.10.124192.168.10.125192.168.10.126192.168.10.127192.168.10.128192.168.10.129192.168.10.130192.168.10.131192.168.10.132192.168.10.133192.168.10.134192.168.10.135192.168.10.136192.168.10.137192.168.10.138192.168.10.139192.168.10.140192.168.10.141192.168.10.142192.168.10.143192.168.10.144192.168.10.145192.168.10.146192.168.10.147192.168.10.148192.168.10.149192.168.10.150192.168.10.151192.168.10.152192.168.10.153192.168.10.154192.168.10.155192.168.10.156192.168.10.157192.168.10.158192.168.10.159192.168.10.160192.168.10.161192.168.10.162192.168.10.163192.168.10.164192.168.10.165192.168.10.166192.168.10.167192.168.10.168192.168.10.169192.168.10.170192.168.10.171192.168.10.172192.168.10.173192.168.10.174192.168.10.175192.168.10.176192.168.10.177192.168.10.178192.168.10.179192.168.10.180192.168.10.181192.168.10.182192.168.10.183192.168.10.184192.168.10.185192.168.10.186192.168.10.187192.168.10.188192.168.10.189192.168.10.190192.168.10.191192.168.10.192192.168.10.193192.168.10.194192.168.10.195192.168.10.196192.168.10.197192.168.10.198192.168.10.199192.168.10.200192.168.10.201192.168.10.202192.168.10.203192.168.10.204192.168.10.205192.168.10.206192.168.10.207192.168.10.208192.168.10.209192.168.10.210192.168.10.211192.168.10.212192.168.10.213192.168.10.214192.168.10.215192.168.10.216192.168.10.217192.168.10.218192.168.10.219192.168.10.220192.168.10.221192.168.10.222192.168.10.223192.168.10.224192.168.10.225192.168.10.226192.168.10.227192.168.10.228192.168.10.229192.168.10.230192.168.10.231192.168.10.232192.168.10.233192.168.10.234192.168.10.235192.168.10.236192.168.10.237192.168.10.238192.168.10.239192.168.10.240192.168.10.241192.168.10.242192.168.10.243192.168.10.244192.168.10.245192.168.10.246192.168.10.247192.168.10.248192.168.10.249192.168.10.250192.168.10.251192.168.10.252192.168.10.253192.168.10.254Process finished with exit code 0
源代码myPyIP.py
"""=== coding: UTF8 ==="""# 斜线记法,要求子网掩码整数(nSubnet个1):32>=nSubnetMask>=0class IP:def __init__(self, strIP: str, nSubnetMask: int):self.strIP = strIP # IP字符串self.nSubnetMask = nSubnetMask # 子网掩码nSubnetMask个1self.subnetMaskTotal = 0 # 子网掩码位nSubnetMask个1用10进制表示self.hostTotal = 0 # 主机位(32-nSubnetMask)个1用10进制表示# 子网掩码字符串self.strSubnetMask = None# 子网号字符串self.strNet = None# 网络可用主机数self.strHostNumber = None# 第一个可用IP字符串self.strFirstValidIP = None# 最后一个可用IP字符串self.strLastValidIP = None# 广播IP字符串self.strBroadCastIP = None# 全部可用IP列表self.listIPValid = []print("你输入的子网:" + self.strIP + '/' + str(self.nSubnetMask))# IP字符串转IP整数,例如:"192.168.10.2"转3232238082@staticmethoddef strIP2nIP(strIP: str) -> int:strListIP = strIP.split(".") # 按照指定的字符分割IP字符串# 提取字符串并转化成整数nIP1 = int(strListIP[0])nIP2 = int(strListIP[1])nIP3 = int(strListIP[2])nIP4 = int(strListIP[3])# 组合成IP整数nIP = ((nIP1 << 24) & 0xFF000000) + ((nIP2 << 16) & 0x00FF0000) + \((nIP3 << 8) & 0x0000FF00) + ((nIP4 << 0) & 0x000000FF)return nIP# IP整数转IP字符串,例如:3232238082转"192.168.10.2"@staticmethoddef nIP2strIP(nIP: int) -> str:# 计算出IP整数各个段10进制整数nIP1 = (nIP & 0xFF000000) >> 24nIP2 = (nIP & 0x00FF0000) >> 16nIP3 = (nIP & 0x0000FF00) >> 8nIP4 = (nIP & 0x000000FF) >> 0# 整合IP整数各个段10进制整数的字符串形式strIP = str(nIP1) + "." + str(nIP2) + "." + str(nIP3) + "." + str(nIP4)return strIP# 获取列表IP段可用范围def getListIPValid(self) -> list:# 清空列表self.listIPValid.clear()# 计算第一个可用IP整数nFirstValidIP = self.strIP2nIP(self.strFirstValidIP)# 计算最后一个可用IP整数nLastValidIP = self.strIP2nIP(self.strLastValidIP)# 计算可用IP列表for nIP in range(nFirstValidIP, nLastValidIP + 1):self.listIPValid.append(self.nIP2strIP(nIP))# 返回可用IP列表return self.listIPValid# 打印列表IP可用范围def printListIPValid(self):for strip in self.listIPValid:print(strip)# 计算IP所有信息def IPToolCal(self):strListIP = self.strIP.split(".") # 按照指定的字符分割IP字符串strIP1 = strListIP[0]strIP2 = strListIP[1]strIP3 = strListIP[2]strIP4 = strListIP[3]nIP1 = int(strIP1)nIP2 = int(strIP2)nIP3 = int(strIP3)nIP4 = int(strIP4)# 计算出子网掩码位nSubnetMask个1用10进制表示的整数for i in range(0, self.nSubnetMask):temp = 1temp <<= (31 - i)self.subnetMaskTotal |= temp# 计算出子网掩码各个段10进制整数nSubnetMask1 = (self.subnetMaskTotal & 0xFF000000) >> 24nSubnetMask2 = (self.subnetMaskTotal & 0x00FF0000) >> 16nSubnetMask3 = (self.subnetMaskTotal & 0x0000FF00) >> 8nSubnetMask4 = (self.subnetMaskTotal & 0x000000FF) >> 0# 整合子网掩码各个段10进制整数的字符串形式self.strSubnetMask = str(nSubnetMask1) + "." + str(nSubnetMask2) + \"." + str(nSubnetMask3) + "." + str(nSubnetMask4)# 输出整合后的子网掩码字符串print("子网掩码:" + self.strSubnetMask)# ------计算网络号-----# 计算出网络号各个段10进制整数的字符串形式strNet1 = str(nIP1 & nSubnetMask1)strNet2 = str(nIP2 & nSubnetMask2)strNet3 = str(nIP3 & nSubnetMask3)strNet4 = str(nIP4 & nSubnetMask4)# 整合网络号各个段10进制整数的字符串形式self.strNet = strNet1 + "." + strNet2 + "." + strNet3 + "." + strNet4# 输出整合后的网络号字符串print("网络号:" + self.strNet)# ----计算每个子网可用主机数----nHostNumber = pow(2, 32 - self.nSubnetMask) - 2 # 计算主机数if nHostNumber >= 0:self.strHostNumber = str(nHostNumber)print("可用主机数:" + self.strHostNumber)# -----计算第一个可用IP------# 计算出第一个可用IP各个段10进制整数的字符串形式strFirstValidIP1 = str(nIP1 & nSubnetMask1)strFirstValidIP2 = str(nIP2 & nSubnetMask2)strFirstValidIP3 = str(nIP3 & nSubnetMask3)strFirstValidIP4 = str((nIP4 & nSubnetMask4) + 1)# 整合第一个可用IP各个段10进制整数的字符串形式self.strFirstValidIP = strFirstValidIP1 + "." + strFirstValidIP2 + "." + strFirstValidIP3 + "." + strFirstValidIP4print("第一个可用IP:" + self.strFirstValidIP) # 输出整合后的第一个可用IP字符串# ------计算最后一个可用IP-----# 计算出主机位(32-nSubnet)个1用10进制表示的整数for i in range(0, 32 - self.nSubnetMask):temp = 1temp <<= iself.hostTotal |= temp# 计算出广播地址,可用IP各个段10进制整数的字符串形式tempHost_1 = (self.hostTotal & 0xFF000000) >> 24strBroadCastIP1 = str((nIP1 & nSubnetMask1) | tempHost_1)tempHost_2 = (self.hostTotal & 0x00FF0000) >> 16strBroadCastIP2 = str((nIP2 & nSubnetMask2) | tempHost_2)tempHost_3 = (self.hostTotal & 0x0000FF00) >> 8strBroadCastIP3 = str((nIP3 & nSubnetMask3) | tempHost_3)tempHost_4 = (self.hostTotal & 0x000000FF) >> 0strBroadCastIP4 = str((nIP4 & nSubnetMask4) | tempHost_4)# 整合广播IP各个段10进制整数的字符串形式self.strBroadCastIP = strBroadCastIP1 + "." + strBroadCastIP2 + "." + strBroadCastIP3 + "." + strBroadCastIP4# 如果广播IP和第一个可用IP相等,说明可用IP数为0if self.strBroadCastIP == self.strFirstValidIP:print("最后一个可用IP:" + self.strBroadCastIP) # 输出整合后的最后一个可用IP字符串print("广播IP:" + self.strBroadCastIP) # 输出整合后的广播IP字符串else:# 计算出最后一个可用IP各个段10进制整数的字符串形式tempHost1 = (self.hostTotal & 0xFF000000) >> 24strLastValidIP1 = str((nIP1 & nSubnetMask1) | tempHost1)tempHost2 = (self.hostTotal & 0x00FF0000) >> 16strLastValidIP2 = str((nIP2 & nSubnetMask2) | tempHost2)tempHost3 = (self.hostTotal & 0x0000FF00) >> 8strLastValidIP3 = str((nIP3 & nSubnetMask3) | tempHost3)tempHost4 = (self.hostTotal & 0x000000FF) >> 0strLastValidIP4 = str(((nIP4 & nSubnetMask4) | tempHost4) - 1)# 整合最后一个可用IP各个段10进制整数的字符串形式self.strLastValidIP = strLastValidIP1 + "." + strLastValidIP2 + "." + strLastValidIP3 + "." + strLastValidIP4print("最后一个可用IP:" + self.strLastValidIP) # 输出整合后的最后一个可用IP字符串print("广播IP:" + self.strBroadCastIP) # 输出整合后的广播IP字符串else:print("可用IP数:" + str(0))print("第一个可用IP:" + " ") # 输出整合后的第一个可用IP字符串print("最后一个可用IP:" + " ") # 输出整合后的最后一个可用IP字符串print("广播IP:" + " ") # 输出整合后的广播IP字符串"""# 主函数if __name__ == '__main__':ip = IP("192.168.10.1", 24)# 计算IP所有信息ip.IPToolCal()# 获取列表IP段可用范围ip.getListIPValid()# 打印列表IP段可用范围ip.printListIPValid()"""
关注上面微信公众号“捷创源科技”,每天获取技术干货,让我们一起成长!
文章转载自捷创源科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




