[英]Python: packing an ip address as a ctype.c_ulong() for use with DLL
給出以下代碼:
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一起使用。 hex函數只是為了向您展示解壓縮的值看起來很像IP地址。
首先是免責聲明:這只是一個有根據的猜測。
ip-address傳統上表示為四個字節 - 即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-radix中完成的 ,尤其是。 prefix_pton 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.