Python: упаковка IP-адреса в виде ctype.c_ulong () для использования с DLL - PullRequest
3 голосов
/ 25 ноября 2008

с учетом следующего кода:

import ctypes    
ip="192.168.1.1"
thisdll = ctypes.cdll['aDLL']
thisdll.functionThatExpectsAnIP(ip)

как я могу правильно упаковать это для DLL, которая ожидает его как тип данных c_ulong?

Я пытался использовать:

ip_netFrmt = socket.inet_aton(ip)
ip_netFrmt_c = ctypes.c_ulong(ip_netFrmt)

однако метод c_ulong() возвращает ошибку, потому что ему нужно целое число.

Есть ли способ использовать struct.pack для этого?

Ответы [ 4 ]

6 голосов
/ 25 ноября 2008

Inet_aton возвращает строку байтов. Раньше это был lingua franca для интерфейсов на языке C.

Вот как распаковать эти байты в более полезное значение.

>>> import socket
>>> packed_n= socket.inet_aton("128.0.0.1")
>>> import struct
>>> struct.unpack( "!L", packed_n )
(2147483649L,)
>>> hex(_[0])
'0x80000001L'

Это распакованное значение можно использовать с ctypes. Суть в том, чтобы показать вам, что распакованное значение очень похоже на IP-адрес.

0 голосов
/ 25 ноября 2008

Для более тщательного анализа IP (v6, CIDR-стиль и т. Д.) Посмотрите, как это делается в py-radix , esp. prefix_pton .

0 голосов
/ 25 ноября 2008

Возможно, есть лучший способ, но он работает:

>>> ip = "192.168.1.1"
>>> struct.unpack('>I', struct.pack('BBBB', *map(int, ip.split('.'))))[0]
3232235777L
0 голосов
/ 25 ноября 2008

Во-первых, отказ от ответственности: это просто обоснованное предположение.

ip-адрес традиционно представляется в виде четырех байтов - т.е. Таким образом, вы должны преобразовать представление 192.168.1.1 в неподписанный тип int. Вы можете преобразовать это так.

ip="192.168.1.1"
ip_long = reduce(lambda x,y:x*256+int(y), ip.split('.'), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...