通过IP地址和掩码计算地址范围(ipv4/ipv6)

工作中需要将IPv4和IPv6的地址和掩码转换为地址范围,写了下面两端python代码来自动计算。代码中没有注释,有疑问请留言。

下面是IPv4地址转换部分,输入比如”192.168.111.253/28,  返回字典['192.168.111.240', '192.168.111.255']

# coding: utf-8

class Ipv4_range:
    def part(self,part_ip,part_mask):
        part_ip = int(part_ip)
        part_mask = int(part_mask)
        delta = 255-part_mask

        ip_min = part_ip & part_mask
        ip_max = ip_min + delta
        return ip_min,ip_max

    def ips(self,ip_mask):
        sep = ip_mask.split('/')
        ip = sep[0]
        mask = self.msk_trans(sep[1])
        part_ips = ip.split('.')
        part_masks = mask.split('.')
        ip_min = ''
        ip_max = ''
        for i in range(0,4):
            part_min, part_max = self.part(part_ips[i],part_masks[i])
            ip_min += str(part_min) + '.'
            ip_max += str(part_max) + '.'
        ip_min = ip_min[:-1]
        ip_max = ip_max[:-1]
        return ([ip_min,ip_max])

    def msk_trans(self,digit):
        add = 32 - int(digit)
        msk_str_b = '1' * int(digit) + '0' * add

        msk1 = msk_str_b[0:8]
        msk2 = msk_str_b[8:16]
        msk3 = msk_str_b[16:24]
        msk4 = msk_str_b[24:32]

        msk1_deci = int(msk1, 2)
        msk2_deci = int(msk2, 2)
        msk3_deci = int(msk3, 2)
        msk4_deci = int(msk4, 2)

        result = str(msk1_deci) + '.' + str(msk2_deci) + '.' + str(msk3_deci) + '.' + str(msk4_deci)
        return result

if __name__ == '__main__':
    ips = Ipv4_range()
    a= ips.ips('192.168.111.253/28')
    print(a)

 下面是IPv6地址转换部分,IPv6比IPv4多一步,因为IPv6地址可能会简写,用两个冒号代替几组零,所以增加了一步转换,首先把“::” 展开为“0”。

# coding: utf-8

class Ipv6_range:

    def ipv6_add0(self,ip):
    # ip = '2409:8000::4808:1741'
        if '::' in ip:
            # print(ip.split(':'))
            if ip[-2:] == '::':
                numb = len(ip.split(':')) - 2
                add = ':0' * (8 - numb)
            else:
                numb = len(ip.split(':')) - 1
                add = ':0' * (8 - numb) + ':'

            ip_add_0 = ip.replace('::', add)
            ip = ip_add_0
        return ip


    def msk_trans(self,digit):
        add = 128 - int(digit)
        msk_str_b = '1' * int(digit) + '0' * add
        msk1 = msk_str_b[0:16]
        msk2 = msk_str_b[16:32]
        msk3 = msk_str_b[32:48]
        msk4 = msk_str_b[48:64]
        msk5 = msk_str_b[64:80]
        msk6 = msk_str_b[80:96]
        msk7 = msk_str_b[96:112]
        msk8 = msk_str_b[112:128]

        msk1_deci = int(msk1, 2)
        msk2_deci = int(msk2, 2)
        msk3_deci = int(msk3, 2)
        msk4_deci = int(msk4, 2)
        msk5_deci = int(msk5, 2)
        msk6_deci = int(msk6, 2)
        msk7_deci = int(msk7, 2)
        msk8_deci = int(msk8, 2)

        result = str(msk1_deci) + '.' + str(msk2_deci) + '.' + str(msk3_deci) + '.' + str(msk4_deci) + '.' +\
        str(msk5_deci) + '.' + str(msk6_deci) + '.' + str(msk7_deci) + '.' + str(msk8_deci)

        return result

    def part(self,part_ip,part_mask):
        part_ip = int(part_ip,16)
        part_mask = int(part_mask)
        delta = 65535-part_mask

        ip_min = part_ip & part_mask
        ip_max = ip_min + delta

        s_ip_min = str(hex(ip_min)).removeprefix('0x')
        s_ip_max = str(hex(ip_max)).removeprefix('0x')

        return s_ip_min,s_ip_max

    def ips(self,ip_mask):
        sep = ip_mask.split('/')
        ip = sep[0]
        ip = self.ipv6_add0(ip)
        mask = self.msk_trans(sep[1])
        # print(ip)
        # print(mask)
        part_ips = ip.split(':')
        part_masks = mask.split('.')
        ip_min = ''
        ip_max = ''
        for i in range(0,8):
            part_min, part_max = self.part(part_ips[i],part_masks[i])
            ip_min += str(part_min) + ':'
            ip_max += str(part_max) + ':'
        ip_min = ip_min[:-1]
        ip_max = ip_max[:-1]
        return ([ip_min,ip_max])



if __name__ == '__main__':
    ip_range = Ipv6_range()
    ip = 'fe80:8000:480a::1741/127'
    a = ip_range.ips(ip)
    print(a)

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: IPv6地址掩码计算工具是一种帮助网络工程师计算IPv6地址掩码的实用工具。在IPv6中,地址掩码通常表示为CIDR的格式,也可以称为前缀长度。例如,掩码为64表示地址的前64位为网络地址,其余的为主机地址。因此,掩码能够帮助确定一个IPv6地址网络中的位置。 使用IPv6地址掩码计算工具,用户只需要输入IPv6地址和相关的掩码长度,然后点击“计算”按钮,工具即可自动计算出对应的网络地址和广播地址。此外,该工具还可以显示主机地址范围,可用地址数量等信息,可以非常方便地帮助网络工程师快速地了解网络拓扑结构。 利用IPv6地址掩码计算工具,网络工程师可以更加方便地进行IP地址规划和管理。特别是在大型企业和数据中心网络中,IPv6地址掩码计算工具非常有用,可以帮助管理员准确地分配地址和管理网络。由于IPv6地址长度远远大于IPv4地址长度,因此IPv6地址掩码计算工具成为了网络工程师必备的工具之一。 ### 回答2: IPv6地址是由128位二进制数组成的,这意味着它比IPv4地址需要更大的空间。IPv6地址掩码计算工具可以帮助人们计算掩码,并且使人们能够更好地理解IPv6地址IPv6掩码是128位比特的一串二进制数字,用于指定网络标识和主机标识的位置。这个掩码可以根据所需的网络大小进行调整,从而确保该网络有足够的IP地址可用。 IPv6地址掩码计算工具可以帮助人们快速计算出正确的掩码,并且还可以提供一些有用的信息,例如网络前缀、主机标识和子网地址等。 在使用IPv6地址掩码计算工具时,用户需要注意以下几点: 1. 输入正确的IPv6地址:在使用掩码计算工具时,首先要输入IPv6地址,确保输入的地址是正确的,否则计算就会出错。 2. 选择正确的掩码长度:掩码长度是指该掩码网络标识和主机标识分开的位置。掩码长度越长,可用的主机数就越少。 3. 理解二进制计算IPv6地址掩码都是由二进制数字组成的,因此,使用掩码计算工具时需要熟悉如何进行二进制计算。 总的来说,IPv6地址掩码计算工具是一个非常有用的工具,它可以帮助人们更好地理解IPv6地址掩码的概念,并且支持人们更好地计算IP地址掩码,从而更好地设计IPv6网络。 ### 回答3: ipv6地址掩码计算工具是一个在线工具,可以帮助用户计算任意IPv6地址的子网掩码及CIDR表示,同时可以对IPv6地址和子网掩码进行二进制转换和反转,帮助用户更方便地理解IPv6地址掩码。 使用IPv6地址掩码计算工具需要输入IPv6地址以及所需的子网掩码前缀长度,工具会自动计算出子网掩码和CIDR表示。用户也可以通过工具内置的二进制转换器将IPv6地址和子网掩码转换成二进制格式,以更加深入地了解IPv6地址掩码的原理。 IPv6地址掩码计算工具在IPv6地址规划和网络工程中具有重要的应用价值。它可以帮助用户对IPv6地址进行精细划分,使得网络的管理更加灵活和高效。同时,掌握IPv6地址掩码计算工具也是网络工程师必备的技能之一。 总之,IPv6地址掩码计算工具是一个实用性很高的在线工具,可以帮助用户更加方便地计算IPv6地址的子网掩码及CIDR表示,并加深对IPv6网络的理解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值