Python:DLLで使用するためにctype.c_ulong()としてIPアドレスをパックする

StackOverflow https://stackoverflow.com/questions/317531

  •  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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top