문제

다음 코드가 주어지면 :

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

IPS (V6, CIDR 스타일 재료 등)를 처리하는보다 철저한 방법은 어떻게 수행되었는지 확인하십시오. py-radix, esp. 접두사 _pton.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top