创建一个IPv4地址并以预期的输出增加它

时间:2018-07-10 07:56:58

标签: python

我如何创建一个IPv4地址0.0.0.0并对其进行递增,这样它给我从0-255的输出为0.0.0.255,然后是0.0.255.255,0.255.255.255,255.255.255.255?

4 个答案:

答案 0 :(得分:2)

避免使用自定义函数,而应使用netaddr软件包。只需为网络netaddr.IPNetwork创建一个0.0.0.0/0对象,就可以通过将其引用为netaddr.IPNetwork('0.0.0.0/0')[n]来获得第n个地址,也可以将其创建为netaddr.IPNetwork('0.0.0.0/0').iter_hosts()

您应该可以通过执行pip install netaddr

来获取它
>>> from netaddr import IPNetwork
>>> net = IPNetwork('0.0.0.0/0') 
>>> net[1]                       
IPAddress('0.0.0.1')
>>> str(net[1])
'0.0.0.1' 

更多示例

>>> str(net[255])  
'0.0.0.255'        
>>> str(net[256])  
'0.0.1.0'          
>>> str(net[65535])
'0.0.255.255'      
>>> str(net[65536])
'0.1.0.0'          

答案 1 :(得分:0)

通过标准库中的ipaddress模块,您可以以显而易见的方式对IP地址进行算术运算,并可以在整数之间以及在点分四进制字符串之间进行转换。

我不确定您要做什么,但是不管它是什么,这都很容易。

例如,这是一个遍历所有40亿个IPv4地址的迭代器:

def all_addrs():
    for i in range(0, 1<<32):
        yield ipaddress.IPv4Address(i)

或者,如果您愿意:

def all_addrs():
    addr = ipaddress.IPv4Address(0)
    while True:
        yield addr
        try:
            addr += 1
        except ValueError:
            return

或者,如果要迭代前256个,则在此之后再做三个特殊地址:

def weird_259():
    for i in range(256):
        yield ipaddress.IPv4Address(i)
    yield ipaddress.IPv4Address('0.0.255.255')
    yield ipaddress.IPv4Address('0.255.255.255')
    yield ipaddress.IPv4Address('255.255.255.255')

如果您想做其他事情,请阅读IPv4Address的文档。请注意,您可以从以下地址构造地址:

  1. 以十进制点表示的字符串…
  2. 一个整数…
  3. 打包到长度为4(最高有效八位字节在前)的bytes对象中的整数。

因此,假设您要使八位字节0、127、255、255成为一个八位字节。您该怎么做?首先,使用这些值创建一个字节:

bytes([0, 127, 255, 255])

…,然后使用这些字节创建一个地址:

ipaddress.IPv4Address(bytes([0, 127, 255, 255]))

如果愿意,可以将其包装在一个函数中:

def makeaddr(a, b, c, d):
    return ipaddress.IPv4Address(bytes([a, b, c, d]))

因此,如果要使用0.0.0.x形式的256个地址,0.0.x.2550.x.255.255x.255.255.255形式的256个地址,这很简单:< / p>

def make_1024():
    for x in range(256):
        yield makeaddr(0, 0, 0, x)
    for x in range(256):
        yield makeaddr(0, 0, x, 255)
    for x in range(256):
        yield makeaddr(0, x, 255, 255)
    for x in range(256):
        yield makeaddr(x, 255, 255, 255)

如果要以默认的(小数点)表示法打印它们,只需print

for addr in make_1024():
    print(addr)

答案 2 :(得分:0)

范围从0到16777216(这是2 ** 24,作为您的标题,要求0.255.255.255,或4294967296,它是2 ** 32,作为您的问题正文,要求255.255.255.255),然后按位与0xff0xff000xff00000xff000000并提取相应的位,然后将它们右移以使用格式进行打印。

for i in range(0, 2 ** 24): # modify to 2 ** 32 if you want to generate output to 255.255.255.255
    byte3 = i & 0xff
    byte2 = i & 0xff00
    byte1 = i & 0xff0000
    byte0 = i & 0xff000000
    print('%d.%d.%d.%d' % (byte0 >> 24, byte1 >> 16, byte2 >> 8, byte3))

答案 3 :(得分:0)

您可以使用struct lib。

import struct

n = 257

y1, y2, y3, y4 = struct.Struct('<I').pack(n & 0xFFFFFFFF)

print("{0}.{1}.{2}.{3}".format(y4,y3,y2,y1)) # OUTPUT: 0.0.1.1

I代表大整数(4个字节),<代表大字节序(字节位置)。
然后,您以正确的顺序格式化字节。通过使用不同的IP地址来增加或减少n