3

次のコードが与えられた場合:

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これを達成するために使用する方法はありますか?

4

4 に答える 4

6

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 で使用できます。16 進数は、展開された値が IP アドレスによく似ていることを示すためのものです。

于 2008-11-25T14:47:23.380 に答える
0

最初の免責事項: これは知識に基づく推測にすぎません。

IP アドレスは伝統的に 4 バイト (つまり xxx.xxx.xxx.xxx) で表されますが、実際には unsigned long です。したがって、表現 192.168.1.1 を unsiged int に変換する必要があります。このように変換できます。

ip="192.168.1.1"
ip_long = reduce(lambda x,y:x*256+int(y), ip.split('.'), 0)
于 2008-11-25T14:45:24.977 に答える
0

おそらくもっと良い方法がありますが、これは機能します:

>>> ip = "192.168.1.1"
>>> struct.unpack('>I', struct.pack('BBBB', *map(int, ip.split('.'))))[0]
3232235777L
于 2008-11-25T14:46:04.663 に答える
0

IP(v6、CIDRスタイルのものなど)を処理するより完全な方法については、特にpy-radixでどのように行われるかを確認してください。prefix_pton

于 2008-11-25T15:07:11.953 に答える