IP地址
00000011100000001111111111111111
将转换成点分十进制格式为:3.128.255.255
。这是因为第一个 8 位 00000011
将转换为 3,第二个 8 位 10000000
将转换为 128,第三个 8 位 11111111
将转换为 255,最后 8 位 11111111
将转换为 255.
如何编写函数
ip_format()
接受二进制格式的 IP 地址并将其转换为点分十进制格式?
ipaddress
模块:
>>> import ipaddress
>>> def ip_format(ip):
... return str(ipaddress.ip_address(int(ip, 2)))
...
>>> ip_format('00000011100000001111111111111111')
'3.128.255.255'
否则,手动完成非常容易:
>>> def ip_format(ip):
... return ".".join(map(str, int(ip, 2).to_bytes(4, "big")))
...
>>> ip_format("00000011100000001111111111111111")
'3.128.255.255'
就逻辑而言:将二进制字符串转换为 integer,将其拆分为单个字节,将其转换为字符串,然后加入
"."
.
当您转换为
int
时,您还可以指定第二个参数作为基数(在本例中,2
表示二进制)。然后你可以一次跨越你的字符串 8 个元素,最后 join
与 '.'
字符
def ip_format(s):
return '.'.join(str(int(s[i:i+8], 2)) for i in range(0, 32, 8))
>>> ip_format('00000011100000001111111111111111')
'3.128.255.255'
def ip_format(s):
return '.'.join(str(int(s[n * 8:(n + 1) * 8], 2)) for n in range(4))
可以使用标准 Python 库转换字符串,如下所示:
import socket
import struct
ip_addr_binary = '00000011100000001111111111111111'
print socket.inet_ntoa(struct.pack('>I', int(ip_addr_binary, 2)))
显示:
3.128.255.255
它是如何工作的?
首先使用
int(x, 2)
将二进制字符串转换成对应的整数。接下来使用 struct.pack()
将数字转换为四个字符的压缩字符串。然后可以将其传递给socket.inet_ntoa(packed_ip)
以将其转换为点分隔的IP地址。