Python : DLL과 함께 사용하기 위해 IP 주소를 ctype.c_ulong ()로 포장
-
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- 언어 인터페이스 용.
바이트를 더 유용한 값으로 포장하는 방법은 다음과 같습니다.
>>> 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 -Address는 전통적으로 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
제휴하지 않습니다 StackOverflow