在cthon中将cidr转换为子网掩码

jus*_*104 5 python ip-address subnet cidr

我有一个我创建的python字典,这个字典包含以下格式的子网列表:

x.x.x.x/24
y.y.y,y/25
z.z.z.z/26
a.a.a.a/27 
Run Code Online (Sandbox Code Playgroud)

等等...

我想取这本字典中的项目,解析它,然后按以下格式吐出结果:

x.x.x.x 255.255.255.0
y.y.y.y 255.255.255.128
x.x.x.x 255.255.255.192
a.a.a.a 255.255.255.224 
Run Code Online (Sandbox Code Playgroud)

我现在对此并不多,因为我在网上找不到很多关于这个主题的内容,而不是任何可以快速简洁的方式.思考?

fal*_*tru 7

import socket
import struct

def cidr_to_netmask(cidr):
    network, net_bits = cidr.split('/')
    host_bits = 32 - int(net_bits)
    netmask = socket.inet_ntoa(struct.pack('!I', (1 << 32) - (1 << host_bits)))
    return network, netmask
Run Code Online (Sandbox Code Playgroud)

用法:

>>> cidr_to_netmask('10.10.1.32/27')
('10.10.1.32', '255.255.255.224')
>>> cidr_to_netmask('208.128.0.0/11')
('208.128.0.0', '255.224.0.0')
>>> cidr_to_netmask('208.130.28.0/22')
('208.130.28.0', '255.255.252.0')
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 7

我以为我会投入自己的解决方案,因为我要比其他答案显示更多的可读性.

def cidr_to_netmask(cidr):
  cidr = int(cidr)
  mask = (0xffffffff >> (32 - cidr)) << (32 - cidr)
  return (str( (0xff000000 & mask) >> 24)   + '.' +
          str( (0x00ff0000 & mask) >> 16)   + '.' +
          str( (0x0000ff00 & mask) >> 8)    + '.' +
          str( (0x000000ff & mask)))
Run Code Online (Sandbox Code Playgroud)

现在更容易看到发生了什么,那就是:

  1. mask通过用1s 填充前面cidr并使其余部分组成来获取数字
  2. 对于每个位,应用 mask
  3. 将所有位连接在一起,以句点分隔

这是非常程序性的,不使用任何库.


Joã*_*ade 6

试试这个解决方案:

蟒蛇3

from ipaddress import IPv4Network

networks = {'n1':'10.1.0.0/21','n2':'10.2.0.0/22','n3':'10.3.0.0/23','n4':'10.4.0.0/24'}

for x,y in enumerate(networks):
    print(IPv4Network(networks[y]).network_address, IPv4Network(networks[y]).netmask)
Run Code Online (Sandbox Code Playgroud)

结果:

10.1.0.0 255.255.248.0
10.2.0.0 255.255.252.0
10.3.0.0 255.255.254.0
10.4.0.0 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

蟒蛇2

from netaddr import IPNetwork

networks = {'n1':'10.1.0.0/21','n2':'10.2.0.0/22','n3':'10.3.0.0/23','n4':'10.4.0.0/24'}

for x,y in enumerate(networks):
    print(str(IPNetwork(networks[y]).network), str(IPNetwork(networks[y]).netmask))
Run Code Online (Sandbox Code Playgroud)

结果:

('10.1.0.0', '255.255.248.0')
('10.2.0.0', '255.255.252.0')
('10.3.0.0', '255.255.254.0')
('10.4.0.0', '255.255.255.0')
Run Code Online (Sandbox Code Playgroud)


Man*_*hit 0

尝试这个

lsIP = []
ans = 0
CIDR = 32
IP = [1] * CIDR
for i in range(len(IP)):
    iIdx = i % 8
    if iIdx == 0:
        if i >= 8:
            lsIP.append(ans)
            ans = 0
    ans += pow(2, 7 - iIdx)
lsIP.append(ans)

[lsIP.append(0) for i in range(4 - len(lsIP))]
print lsIP
Run Code Online (Sandbox Code Playgroud)