我如何创建一个IPv4地址0.0.0.0并对其进行递增,这样它给我从0-255的输出为0.0.0.255,然后是0.0.255.255,0.255.255.255,255.255.255.255?
答案 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
的文档。请注意,您可以从以下地址构造地址:
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.255
,0.x.255.255
和x.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
),然后按位与0xff
,0xff00
,0xff0000
,0xff000000
并提取相应的位,然后将它们右移以使用格式进行打印。
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