Python:DLLで使用するためにctype.c_ulong()としてIPアドレスをパックする
-
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言語インターフェイスの lingua franca でした。
これらのバイトをより便利な値にアンパックする方法は次のとおりです。
>>> import socket
>>> packed_n= socket.inet_aton("128.0.0.1")
>>> import struct
>>> struct.unpack( "!L", packed_n )
(2147483649L,)
>>> hex(_[0])
'0x80000001L'
このアンパックされた値は、ctypesで使用できます。 16進数のことは、アンパックされた値がIPアドレスによく似ていることを示すことです。
他のヒント
まず免責事項:これは単なる知識に基づいた推測です。
IPアドレスは、伝統的に4バイト、つまりxxx.xxx.xxx.xxxとして表されますが、実際には符号なしの長さです。したがって、表現192.168.1.1をサイジ化されていない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 。
所属していません StackOverflow