【问题标题】:How to convert ip address to DWORD?如何将IP地址转换为DWORD?
【发布时间】:2010-02-07 17:43:35
【问题描述】:

你好,如何使用 python 将 ip 地址转换为 DWORD?

我搜索了一段时间,但没有找到任何有用的东西。

感谢帮助!

【问题讨论】:

  • 对此有一个非常好的库调用。 struct.inet_pton。你应该使用它而不是滚动你自己的解析器。
  • ...除非您使用的是 Windows。它不在该平台上的套接字库中。然而,inet_aton 是。

标签: python ip-address dword


【解决方案1】:

不要推出自己的解决方案。使用socket 库。

import socket
socket.inet_pton(socket.AF_INET, "127.0.0.1")

当它无法正确解析地址时,它会抛出异常,而为事物编写自己的解析器只是解决问题的秘诀。

这样做还可以更轻松地将您的代码转换为 IPv6。而为 IPv6 编写自己的地址解析器将是一个非常糟糕的主意,因为 IPv6 地址很复杂并且有一些奇怪的极端情况。

编辑:显然,这在 Windows 上不起作用。我不确定您应该如何在 Windows 上解析 IPv6 地址,但仍有一个库调用可以解析 IPv4 地址。它是socket.inet_aton,如果socket.inet_pton 不存在,您应该使用它,而不是滚动您自己的解决方案。

【讨论】:

    【解决方案2】:

    假设您有正确的 IPv4,您可以这样做,例如:

    import struct
    
    ip = "192.168.2.101"
    components = map(int, ip.split("."))
    asLittleEndianDword = struct.pack("<I", (components[0] << 24) |
                                            (components[1] << 16) |
                                            (components[2] << 8) |
                                            components[3])
    

    【讨论】:

      【解决方案3】:

      Python 没有 DWORD 类型。如果您需要它作为 4 字节字符串,请使用:

      struct.pack('bbbb', *(int(x) for x in '127.0.0.1'.split('.')))
      

      【讨论】:

      • 如果字节序不正常,你会做 reverse('127.0.0.1'.split('.')) 吗?
      • 不,我只是在结果字符串上使用[::-1]
      • 我会让struct 处理字节序问题。
      • 考虑到这一点,我将不得不投票给你。当库有一个非常好的解析器时编写自己的解析器是个坏主意。
      猜你喜欢
      • 2013-05-09
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      相关资源
      最近更新 更多