2010-02-07 154 views
1

嘿,我怎样才能将IP地址转换为使用Python的DWORD?如何将IP地址转换为DWORD?

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

谢谢你的帮手!假设你有一个正确的IPv4

+2

这是一个非常好的图书馆电话。 'struct.inet_pton'。你应该使用它而不是滚动你自己的解析器。 – Omnifarious 2010-02-07 18:26:36

+1

...除非你使用Windows。它不在该平台上的套接字库中。但是,inet_aton是。 – 2010-02-07 23:50:14

+0

参见http://stackoverflow.com/questions/317531/python-packing-an-ip-address-as-a-ctype-c-ulong-for-use-with-dll(例如)。 – 2010-02-08 02:56:35

回答

-1

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

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

如果endian-ness失控,你会做相反的('127.0.0.1'.split('。'))? – 2010-02-07 17:51:05

+0

不,我只是在结果字符串上使用'[:: - 1]'。 – 2010-02-07 17:52:13

+0

我会让'struct'处理字节序问题。 – Omnifarious 2010-02-07 18:25:28

0

,你能做到这一点,例如:

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]) 
4

请勿滚动您自己的解决方案。使用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而不是滚动您自己的解决方案,则应该使用它。