在Python中将IP地址字符串转换为二进制

时间:2010-04-28 23:25:14

标签: python binary ip

作为更大的应用程序的一部分,我试图将IP地址转换为二进制。目的是稍后计算LAN唤醒流量的广播地址。我假设有一种更有效的方式来做我想的方式。这是通过八位字节分解IP地址,在必要时将0添加到每个八位字节的开头,将每个八位字节转换为二进制,然后组合结果。我应该看看netaddr,套接字还是完全不同的东西?

示例:从192.168.1.1到11000000.10101000.00000001.00000001

6 个答案:

答案 0 :(得分:7)

socketinet_aton()你想要什么?

答案 1 :(得分:7)

你想到下面的东西?

ip = '192.168.1.1'
print '.'.join([bin(int(x)+256)[3:] for x in ip.split('.')])

我同意其他人的意见,你可能应该避免转换为二进制表示来实现你想要的目标。

答案 2 :(得分:3)

  

目的是稍后计算LAN唤醒流量的广播地址

ipaddr(见PEP 3144):

import ipaddr

print ipaddr.IPNetwork('192.168.1.1/24').broadcast
# -> 192.168.1.255

在Python 3.3中,ipaddress module

#!/usr/bin/env python3
import ipaddress

print(ipaddress.IPv4Network('192.162.1.1/24', strict=False).broadcast_address)
# -> 192.168.1.255

要准确匹配您问题中的示例:

# convert ip string to a binary number
print(bin(int(ipaddress.IPv4Address('192.168.1.1'))))
# -> 0b11000000101010000000000100000001

答案 3 :(得分:2)

您可以使用字符串格式功能将数字转换为二进制。我做了这个功能:

def ip2bin(ip):
    octets = map(int, ip.split('/')[0].split('.')) # '1.2.3.4'=>[1, 2, 3, 4]
    binary = '{0:08b}{1:08b}{2:08b}{3:08b}'.format(*octets)
    range = int(ip.split('/')[1]) if '/' in ip else None
    return binary[:range] if range else binary

这将返回二进制IP或IP范围,因此您可以使用它来测试IP是否在范围内:

>>> ip2bin('255.255.127.0')
'11111111111111110111111100000000'
>>> ip2bin('255.255.127.0/24')
'111111111111111101111111'
>>> ip2bin('255.255.127.123').startswith(ip2bin('255.255.127.0/24'))
True

答案 4 :(得分:1)

在变量

中定义IP地址
ipadd = "10.10.20.20"

转换列表中的IP地址

ip = ipadd.split(".")

现在以二进制数转换IP地址

print ('{0:08b}.{1:08b}.{2:08b}. 
    {3:08b}'.format(int(ip[0]),int(ip[1]),int(ip[2]),int(ip[3])))

00001010.00001010.00010100.00010100

答案 5 :(得分:0)

IP = '192.168.1.1'

ip2bin =  ".".join(map(str,["{0:08b}".format(int(x)) for x in IP.split(".")]))
print(ip2bin)

输出

11000000.10101000.00000001.00000001