相关文章推荐
酷酷的排球  ·  Send-MailMessage ...·  3 月前    · 
大力的黑框眼镜  ·  👏 ...·  1 年前    · 

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

15 人关注

作为一个更大的应用的一部分,我正试图将一个IP地址转换为二进制。目的是为了以后计算广播地址,以唤醒局域网上的通信。我假设有一种更有效的方法来做这件事,而不是我所想的方法。这就是按八位数分割IP地址,必要时在每个八位数的开头加0,将每个八位数转换为二进制,然后将结果合并。我应该看netaddr,sockets,还是完全不同的东西?

例如:从192.168.1.1到11000000.10101000.0000000001.00000001

4 个评论
Nate
你是想把一个IPv4地址转换为整数表示吗?或者你想转换为什么二进制表示?
例如:从192.168.1.1到11000000.10101000.0000000001.0000000001
这是一种极其不常见的表达ipaddresses的方式。我不认为有任何模块可以产生或消费这种格式。
你所想的方式是完全好的,而且足够高效,IMHO。
python
binary
ip
pizzim13
pizzim13
发布于 2010-04-29
8 个回答
EMP
EMP
发布于 2022-07-19
已采纳
0 人赞同

Is socket . inet_aton() what you want?

jfs
It seems to work: bin(struct.unpack('!I', socket.inet_aton('192.168.1.1'))[0]) -> '0b11000000101010000000000100000001'
kriss
kriss
发布于 2022-07-19
0 人赞同

You think of something like below ?

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

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

这就是我在寻找的东西,但是,我不完全理解它是如何工作的。我知道你在用'.'分割ip地址,然后用'.'连接结果,并从整数转换为二进制,但这。"(x)+256)[3:] for x in",完全不明白。你能指出正确的方向来查找你在做什么吗?
@pizzim13:没有魔力。你很清楚它是如何工作的。+256的存在是为了始终有一个9位的二进制数字,然后很容易去除数字前面的0b1。
@pizzim13:对于 [... for x in ... ] 部分,请看 list comprehension 在Python文档中。
jfs
jfs
发布于 2022-07-19
0 人赞同

目的是为了以后计算广播地址,以便在局域网流量中唤醒。

ipaddr (see PEP 3144 ):

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

In 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
    
Danilo
Danilo
发布于 2022-07-19
0 人赞同

你可以使用字符串格式函数将数字转换为二进制。我做了这个函数。

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'))
    
f4d0
这正是我所寻找的。太感谢了。
Devendra Singh
Devendra Singh
发布于 2022-07-19
0 人赞同

在变量中定义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
    
Ahmed
Ahmed
发布于 2022-07-19
0 人赞同
IP = '192.168.1.1'
ip2bin =  ".".join(map(str,["{0:08b}".format(int(x)) for x in IP.split(".")]))
print(ip2bin)

output

11000000.10101000.00000001.00000001
    
Mythily Thangavelu
Mythily Thangavelu
发布于 2022-07-19
0 人赞同

ip = '192.168.1.1'

k=[" "]

for x in ip.split("."):

   a=(bin(int(x))[2:])
   k.append(a)    

print(".".join(list(k))[2:])

按照目前的写法,你的答案是不清楚的。请 edit 添加额外的细节,以帮助其他人了解这如何解决所问的问题。你可以找到更多关于如何写好答案的信息 in the help center .
Eron Lloyd
Eron Lloyd
发布于 2022-07-19
0 人赞同

我是应该看netaddr、sockets还是完全不同的东西?

对于现在的人来说,如果你想做Python 3.3+内置的 ipaddress 模块不支持的事情,你应该使用 netaddr 。下面是你如何用 netaddr 做你想做的事情,作为一个例子。