IP地址-webkit-print-color-adjust: exact;
将转换为点分十进制格式:00000011100000001111111111111111
。这是因为第1个8位3.128.255.255
将被转换为3,第2个8位00000011
将被转换为128,第3个8位10000000
将被转换为255而最后一个8位11111111
将转换为255。
如何编写一个接受二进制格式的IP地址并将其转换为点分十进制格式的函数11111111
?
答案 0 :(得分:2)
您可以使用标准库中的ipaddress
模块:
move
否则,手动操作非常简单:
>>> import ipaddress
>>> def ip_format(ip):
... return str(ipaddress.ip_address(int(ip, 2)))
...
>>> ip_format('00000011100000001111111111111111')
'3.128.255.255'
就逻辑而言:将二进制字符串转换为integer,将其拆分为单个字节,将其转换为字符串,然后与>>> def ip_format(ip):
... return ".".join(map(str, int(ip, 2).to_bytes(4, "big")))
...
>>> ip_format("00000011100000001111111111111111")
'3.128.255.255'
连接。
答案 1 :(得分:1)
转换为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'
答案 2 :(得分:1)
def ip_format(s):
return '.'.join(str(int(s[n * 8:(n + 1) * 8], 2)) for n in range(4))
答案 3 :(得分:1)
可以使用标准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地址。