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

时间:2017-08-25 15:06:44

标签: python ip-address

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

4 个答案:

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