首页 > 技术文章 > Python实现网络和IP地址计算

qingkongwuyun 2021-11-26 09:37 原文

import math
def bin_to_ip(bin_str):
    if len(bin_str) < 32:
        bin_str ='%s%s'%('0' * (32 - len(bin_str)), bin_str)
    a = bin_str[0:8]
    b = bin_str[8:16]
    c = bin_str[16:24]
    d = bin_str[24:32]
    return '%s.%s.%s.%s' % (str(int('0b%s' % a, 2)), str(int('0b%s' % b, 2)), str(int('0b%s' % c, 2)), str(int('0b%s' % d, 2)))

# 二进制并计算
def bin_and(bin_str, mask_str):
    new_str = ''
    for i in range(32):
        if mask_str[i] == '1' and bin_str[i] == '1':
            new_str = "%s%s"%(new_str, 1)
        else:
            new_str = "%s%s"%(new_str, 0)
    return new_str
# 十进制转换成二进制字符
def str_to_bin(ip, mask):
    ip_bin_str = ''
    for s in str(ip).split('.'):
        b_str = ''
        for i in range(8):
            try:
                b_str = '%s%s' % (b_str, (bin(int(s))[2:][i]))
            except:
                b_str = '%s%s' % ('0', b_str)
        ip_bin_str = '%s%s' % (ip_bin_str, b_str)
    mask_bin_str = '1' * int(mask)
    if len(mask_bin_str) < 32:
        mask_bin_str = mask_bin_str + '0' * (32 - int(mask))
    return ip_bin_str, mask_bin_str
def main(ip_mask):
    ip_str, mask_str = ip_mask.split('/')
    ip_bin_str, mask_bin_str = str_to_bin(ip_str, mask_str)
    host_ip_bin = (bin_and(ip_bin_str, mask_bin_str))
    ip_num = (int(math.pow(2, 32 - int(mask_str)))) - 2
    mask = bin_to_ip(mask_bin_str)
    host_ip = bin_to_ip(host_ip_bin)
    ip_list = []
    for i in range(ip_num+2):
        ip_list.append(bin_to_ip(str(bin(int('0b%s' % host_ip_bin, 2) + i))[2:]))
    first_use_ip = ip_list[1]
    last_use_ip = ip_list[-2]
    broad_ip = ip_list[-1]
    use_ips = ip_list[1:-1]
    return ip_num, mask, host_ip, first_use_ip, last_use_ip, broad_ip, use_ips
if __name__ == '__main__':
    ip_mask = '192.168.32.125/29'
    ip_num, mask, host_ip, first_use_ip, last_use_ip, broad_ip, use_ips = main(ip_mask)

    print('-+-'*8)
    print('ip num:', ip_num)
    print('mask', mask)
    print('host ip:', host_ip)
    print('first use ip:', first_use_ip)
    print('last use ip:', last_use_ip)
    print('broad ip:', broad_ip)

 

推荐阅读