2010-02-07 1 views
1

Эй, как я могу конвертировать ip-адрес в DWORD с помощью python?Как конвертировать ip-адрес в DWORD?

Я искал какое-то время, но не нашел ничего полезного.

Спасибо за помощь!

+2

Для этого есть отличный звонок для библиотеки. 'Struct.inet_pton'. Вы должны использовать его вместо того, чтобы опрокидывать свой собственный парсер. – Omnifarious

+1

... если вы не используете Windows. Это не в библиотеке сокетов на этой платформе. inet_aton, однако. –

+0

См. Также http://stackoverflow.com/questions/317531/python-packing-an-ip-address-as-a-ctype-c-ulong-for-use-with-dll (например). –

ответ

-1

Python не имеет тип DWORD. Если вам это необходимо в качестве 4-байтовой строки, используйте:

struct.pack('bbbb', *(int(x) for x in '127.0.0.1'.split('.'))) 
+0

И если энсинус не удастся, вы бы сделали наоборот ('127.0.0.1'.split ('. '))? –

+0

Нет, я бы просто использовал '[:: - 1]' в результирующей строке. –

+0

Я бы обработал 'struct' проблемы с контентом. – Omnifarious

0

Если у вас есть правильный IPv4, вы можете сделать это, например:

import struct 

ip = "192.168.2.101" 
components = map(int, ip.split(".")) 
asLittleEndianDword = struct.pack("<I", (components[0] << 24) | 
             (components[1] << 16) | 
             (components[2] << 8) | 
             components[3]) 
4

Не катите свое собственное решение. Используйте библиотеку socket.

import socket 
socket.inet_pton(socket.AF_INET, "127.0.0.1") 

Он будет бросать исключения, когда он не может правильно разобрать адрес, и писать свои собственные парсер для вещей просто рецепт проблем по линии.

Выполнение этого способа также облегчает переход вашего кода на IPv6. И написать собственный парсер для IPv6 будет очень плохой идеей, потому что адреса IPv6 сложны и имеют некоторые странные угловые случаи.

Редактировать: По-видимому, это не работает в Windows. Я не уверен, как вы должны анализировать IPv6-адреса в Windows, но по-прежнему существует вызов библиотеки, который может анализировать адреса IPv4. Это socket.inet_aton, и вы должны использовать его, если socket.inet_pton не существует, а не сворачивает собственное решение.

Смежные вопросы