Python的:包装的IP地址作为ctype.c_ulong()与DLL使用
-
11-07-2019 - |
题
给出的以下代码:
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
不隶属于 StackOverflow