暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python编写IP地址计算第一个可用IP地址、最后一个可用IP地址、网络号、广播地址、主机数

捷创源科技 2022-04-17
2897

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


自己用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.255
    192.168.10.1
    192.168.10.2
    192.168.10.3
    192.168.10.4
    192.168.10.5
    192.168.10.6
    192.168.10.7
    192.168.10.8
    192.168.10.9
    192.168.10.10
    192.168.10.11
    192.168.10.12
    192.168.10.13
    192.168.10.14
    192.168.10.15
    192.168.10.16
    192.168.10.17
    192.168.10.18
    192.168.10.19
    192.168.10.20
    192.168.10.21
    192.168.10.22
    192.168.10.23
    192.168.10.24
    192.168.10.25
    192.168.10.26
    192.168.10.27
    192.168.10.28
    192.168.10.29
    192.168.10.30
    192.168.10.31
    192.168.10.32
    192.168.10.33
    192.168.10.34
    192.168.10.35
    192.168.10.36
    192.168.10.37
    192.168.10.38
    192.168.10.39
    192.168.10.40
    192.168.10.41
    192.168.10.42
    192.168.10.43
    192.168.10.44
    192.168.10.45
    192.168.10.46
    192.168.10.47
    192.168.10.48
    192.168.10.49
    192.168.10.50
    192.168.10.51
    192.168.10.52
    192.168.10.53
    192.168.10.54
    192.168.10.55
    192.168.10.56
    192.168.10.57
    192.168.10.58
    192.168.10.59
    192.168.10.60
    192.168.10.61
    192.168.10.62
    192.168.10.63
    192.168.10.64
    192.168.10.65
    192.168.10.66
    192.168.10.67
    192.168.10.68
    192.168.10.69
    192.168.10.70
    192.168.10.71
    192.168.10.72
    192.168.10.73
    192.168.10.74
    192.168.10.75
    192.168.10.76
    192.168.10.77
    192.168.10.78
    192.168.10.79
    192.168.10.80
    192.168.10.81
    192.168.10.82
    192.168.10.83
    192.168.10.84
    192.168.10.85
    192.168.10.86
    192.168.10.87
    192.168.10.88
    192.168.10.89
    192.168.10.90
    192.168.10.91
    192.168.10.92
    192.168.10.93
    192.168.10.94
    192.168.10.95
    192.168.10.96
    192.168.10.97
    192.168.10.98
    192.168.10.99
    192.168.10.100
    192.168.10.101
    192.168.10.102
    192.168.10.103
    192.168.10.104
    192.168.10.105
    192.168.10.106
    192.168.10.107
    192.168.10.108
    192.168.10.109
    192.168.10.110
    192.168.10.111
    192.168.10.112
    192.168.10.113
    192.168.10.114
    192.168.10.115
    192.168.10.116
    192.168.10.117
    192.168.10.118
    192.168.10.119
    192.168.10.120
    192.168.10.121
    192.168.10.122
    192.168.10.123
    192.168.10.124
    192.168.10.125
    192.168.10.126
    192.168.10.127
    192.168.10.128
    192.168.10.129
    192.168.10.130
    192.168.10.131
    192.168.10.132
    192.168.10.133
    192.168.10.134
    192.168.10.135
    192.168.10.136
    192.168.10.137
    192.168.10.138
    192.168.10.139
    192.168.10.140
    192.168.10.141
    192.168.10.142
    192.168.10.143
    192.168.10.144
    192.168.10.145
    192.168.10.146
    192.168.10.147
    192.168.10.148
    192.168.10.149
    192.168.10.150
    192.168.10.151
    192.168.10.152
    192.168.10.153
    192.168.10.154
    192.168.10.155
    192.168.10.156
    192.168.10.157
    192.168.10.158
    192.168.10.159
    192.168.10.160
    192.168.10.161
    192.168.10.162
    192.168.10.163
    192.168.10.164
    192.168.10.165
    192.168.10.166
    192.168.10.167
    192.168.10.168
    192.168.10.169
    192.168.10.170
    192.168.10.171
    192.168.10.172
    192.168.10.173
    192.168.10.174
    192.168.10.175
    192.168.10.176
    192.168.10.177
    192.168.10.178
    192.168.10.179
    192.168.10.180
    192.168.10.181
    192.168.10.182
    192.168.10.183
    192.168.10.184
    192.168.10.185
    192.168.10.186
    192.168.10.187
    192.168.10.188
    192.168.10.189
    192.168.10.190
    192.168.10.191
    192.168.10.192
    192.168.10.193
    192.168.10.194
    192.168.10.195
    192.168.10.196
    192.168.10.197
    192.168.10.198
    192.168.10.199
    192.168.10.200
    192.168.10.201
    192.168.10.202
    192.168.10.203
    192.168.10.204
    192.168.10.205
    192.168.10.206
    192.168.10.207
    192.168.10.208
    192.168.10.209
    192.168.10.210
    192.168.10.211
    192.168.10.212
    192.168.10.213
    192.168.10.214
    192.168.10.215
    192.168.10.216
    192.168.10.217
    192.168.10.218
    192.168.10.219
    192.168.10.220
    192.168.10.221
    192.168.10.222
    192.168.10.223
    192.168.10.224
    192.168.10.225
    192.168.10.226
    192.168.10.227
    192.168.10.228
    192.168.10.229
    192.168.10.230
    192.168.10.231
    192.168.10.232
    192.168.10.233
    192.168.10.234
    192.168.10.235
    192.168.10.236
    192.168.10.237
    192.168.10.238
    192.168.10.239
    192.168.10.240
    192.168.10.241
    192.168.10.242
    192.168.10.243
    192.168.10.244
    192.168.10.245
    192.168.10.246
    192.168.10.247
    192.168.10.248
    192.168.10.249
    192.168.10.250
    192.168.10.251
    192.168.10.252
    192.168.10.253
    192.168.10.254


    Process finished with exit code 0


    源代码myPyIP.py


      """=== coding: UTF8 ==="""




      # 斜线记法,要求子网掩码整数(nSubnet个1):32>=nSubnetMask>=0
      class IP:
      def __init__(self, strIP: str, nSubnetMask: int):
      self.strIP = strIP # IP字符串
      self.nSubnetMask = nSubnetMask # 子网掩码nSubnetMask个1
      self.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
      @staticmethod
      def 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"
      @staticmethod
      def nIP2strIP(nIP: int) -> str:
      # 计算出IP整数各个段10进制整数
      nIP1 = (nIP & 0xFF000000) >> 24
      nIP2 = (nIP & 0x00FF0000) >> 16
      nIP3 = (nIP & 0x0000FF00) >> 8
      nIP4 = (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 = 1
      temp <<= (31 - i)
      self.subnetMaskTotal |= temp


      # 计算出子网掩码各个段10进制整数
      nSubnetMask1 = (self.subnetMaskTotal & 0xFF000000) >> 24
      nSubnetMask2 = (self.subnetMaskTotal & 0x00FF0000) >> 16
      nSubnetMask3 = (self.subnetMaskTotal & 0x0000FF00) >> 8
      nSubnetMask4 = (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 + "." + strFirstValidIP4
      print("第一个可用IP:" + self.strFirstValidIP) # 输出整合后的第一个可用IP字符串


      # ------计算最后一个可用IP-----
      # 计算出主机位(32-nSubnet)个1用10进制表示的整数
      for i in range(0, 32 - self.nSubnetMask):
      temp = 1
      temp <<= i
      self.hostTotal |= temp


      # 计算出广播地址,可用IP各个段10进制整数的字符串形式
      tempHost_1 = (self.hostTotal & 0xFF000000) >> 24
      strBroadCastIP1 = str((nIP1 & nSubnetMask1) | tempHost_1)
      tempHost_2 = (self.hostTotal & 0x00FF0000) >> 16
      strBroadCastIP2 = str((nIP2 & nSubnetMask2) | tempHost_2)
      tempHost_3 = (self.hostTotal & 0x0000FF00) >> 8
      strBroadCastIP3 = str((nIP3 & nSubnetMask3) | tempHost_3)
      tempHost_4 = (self.hostTotal & 0x000000FF) >> 0
      strBroadCastIP4 = str((nIP4 & nSubnetMask4) | tempHost_4)
      # 整合广播IP各个段10进制整数的字符串形式
      self.strBroadCastIP = strBroadCastIP1 + "." + strBroadCastIP2 + "." + strBroadCastIP3 + "." + strBroadCastIP4


      # 如果广播IP和第一个可用IP相等,说明可用IP数为0
      if self.strBroadCastIP == self.strFirstValidIP:
      print("最后一个可用IP:" + self.strBroadCastIP) # 输出整合后的最后一个可用IP字符串
      print("广播IP:" + self.strBroadCastIP) # 输出整合后的广播IP字符串
      else:
      # 计算出最后一个可用IP各个段10进制整数的字符串形式
      tempHost1 = (self.hostTotal & 0xFF000000) >> 24
      strLastValidIP1 = str((nIP1 & nSubnetMask1) | tempHost1)
      tempHost2 = (self.hostTotal & 0x00FF0000) >> 16
      strLastValidIP2 = str((nIP2 & nSubnetMask2) | tempHost2)
      tempHost3 = (self.hostTotal & 0x0000FF00) >> 8
      strLastValidIP3 = str((nIP3 & nSubnetMask3) | tempHost3)
      tempHost4 = (self.hostTotal & 0x000000FF) >> 0
      strLastValidIP4 = str(((nIP4 & nSubnetMask4) | tempHost4) - 1)
      # 整合最后一个可用IP各个段10进制整数的字符串形式
      self.strLastValidIP = strLastValidIP1 + "." + strLastValidIP2 + "." + strLastValidIP3 + "." + strLastValidIP4
      print("最后一个可用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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论