如何将 32 个字符的 ip 地址转换为二进制点分十进制格式? [重复]

问题描述 投票:0回答:4

IP地址

00000011100000001111111111111111
将转换成点分十进制格式为:
3.128.255.255
。这是因为第一个 8 位
00000011
将转换为 3,第二个 8 位
10000000
将转换为 128,第三个 8 位
11111111
将转换为 255,最后 8 位
11111111
将转换为 255.

如何编写函数

ip_format()
接受二进制格式的 IP 地址并将其转换为点分十进制格式?

python ip-address
4个回答
2
投票

您可以使用标准库中的

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,将其拆分为单个字节,将其转换为字符串,然后加入

"."
.


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'

1
投票
def ip_format(s): 
    return '.'.join(str(int(s[n * 8:(n + 1) * 8], 2)) for n in range(4))

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地址。

© www.soinside.com 2019 - 2024. All rights reserved.