如何将IP地址转换为DWORD?
Python没有一个DWORD类型。如果您需要它作为4字节字符串,请使用:
struct.pack('bbbb', *(int(x) for x in '127.0.0.1'.split('.')))
如果endian-ness失控,你会做相反的('127.0.0.1'.split('。'))? – 2010-02-07 17:51:05
不,我只是在结果字符串上使用'[:: - 1]'。 – 2010-02-07 17:52:13
我会让'struct'处理字节序问题。 – Omnifarious 2010-02-07 18:25:28
,你能做到这一点,例如:
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])
请勿滚动您自己的解决方案。使用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
而不是滚动您自己的解决方案,则应该使用它。
这是一个非常好的图书馆电话。 'struct.inet_pton'。你应该使用它而不是滚动你自己的解析器。 – Omnifarious 2010-02-07 18:26:36
...除非你使用Windows。它不在该平台上的套接字库中。但是,inet_aton是。 – 2010-02-07 23:50:14
参见http://*.com/questions/317531/python-packing-an-ip-address-as-a-ctype-c-ulong-for-use-with-dll(例如)。 – 2010-02-08 02:56:35