簡體   English   中英

Python:將ip地址打包為ctype.c_ulong()以與DLL一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM