【问题标题】:Convert IP address string to binary in Python在Python中将IP地址字符串转换为二进制
【发布时间】:2011-02-13 14:18:47
【问题描述】:

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

示例:从 192.168.1.1 到 11000000.10101000.00000001.00000001

【问题讨论】:

  • 您是否希望将 IPv4 地址转换为其整数表示?或者你想转换成什么二进制表示?
  • 示例:从 192.168.1.1 到 11000000.10101000.00000001.00000001
  • 这是一种非常不常见的表示 ipaddresses 的方式。我认为不存在任何模块来生成或使用该格式。
  • 恕我直言,您的想法非常好且足够高效。

标签: python binary ip


【解决方案1】:

socket.inet_aton() 是你想要的吗?

【讨论】:

  • 它似乎工作:bin(struct.unpack('!I', socket.inet_aton('192.168.1.1'))[0]) -> '0b11000000101010000000000100000001'
【解决方案2】:

你想到下面这样的事情吗?

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 ... ] 部分,请查看 python 文档中的 list comprehension
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    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
    

    【讨论】:

    • 正是我想要的。非常感谢。
    【解决方案5】:

    在变量中定义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
    

    【讨论】:

      【解决方案6】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-22
        • 2013-11-13
        • 2023-03-05
        • 2023-03-20
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        相关资源
        最近更新 更多