给出的以下代码:

import ctypes    
ip="192.168.1.1"
thisdll = ctypes.cdll['aDLL']
thisdll.functionThatExpectsAnIP(ip)

如何能正确包此对于预期它作为一个c_ulong数据类型的DLL?

我已经尝试使用:

ip_netFrmt = socket.inet_aton(ip)
ip_netFrmt_c = ctypes.c_ulong(ip_netFrmt)

然而,因为它需要一个整数c_ulong()方法将返回错误。

有使用struct.pack来完成此的方法吗?

有帮助吗?

解决方案

在INET_ATON返回的字节串。过去,这是在用得上对于C语言接口。

下面是如何打开这些字节成更有用的值。

>>> import socket
>>> packed_n= socket.inet_aton("128.0.0.1")
>>> import struct
>>> struct.unpack( "!L", packed_n )
(2147483649L,)
>>> hex(_[0])
'0x80000001L'

此解压缩值可以与ctypes的使用。十六进制的事情就是告诉你,解压后的值看起来很像一个IP地址。

其他提示

首先免责声明:这仅仅是一个受过教育的猜测

的IP地址是传统上表示为四个字节 - 即xxx.xxx.xxx.xxx,但确实是一个无符号长。所以,你应该表示192.168.1.1转换为unsiged INT。你可以把它转换成这个样子。

ip="192.168.1.1"
ip_long = reduce(lambda x,y:x*256+int(y), ip.split('.'), 0)

有可能是一个更好的办法,但这个工程:

>>> ip = "192.168.1.1"
>>> struct.unpack('>I', struct.pack('BBBB', *map(int, ip.split('.'))))[0]
3232235777L

有关处理IP地址(V6,CIDR风格的东西等),检查了它是如何在的 PY-基数时,电除尘器。 prefix_pton

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top