Obtenga la máscara IP de la dirección IP y la longitud de la máscara en Python

Dada una dirección IP en notación cuádruple punteada, por ejemplo:
192.192.45.1
Y una longitud de máscara, por ejemplo, 8, 16, 24 normalmente, pero podría ser cualquier cosa, por ejemplo, 17.

¿Alguien puede proporcionar el código en python para calcular la máscara de subred? Preferiblemente, podría obtener el resultado como un entero de 32 bits para que sea fácil de hash y luego reinterpretarlo como un punto de puntos cuando sea necesario para imprimir. Veo que python tiene una biblioteca de sockets que es básicamente una envoltura alrededor del api de socket de unix. También vi que tiene la función inet_ntoa (), pero devuelve algún tipo de estructura de paquete. No estoy terriblemente familiarizado con la biblioteca de estructuras de Python, así que esperaba que algún otro tuviera algunas ideas. ¡Gracias!

La forma más sencilla es utilizar el módulo ipaddr de google. Asumo una máscara de 25 bits a continuación, pero como dices, podría ser cualquier cosa.

>>> import ipaddr >>> mask = ipaddr.IPv4Network('192.192.45.1/25') >>> mask.netmask IPv4Address('255.255.255.128') >>> 

El módulo es bastante eficiente en la manipulación de direcciones IPv4 e IPv6 … una muestra de alguna otra funcionalidad en él …

 >>> ## Subnet number? >>> mask.network IPv4Address('192.192.45.0') >>> >>> ## RFC 1918 space? >>> mask.is_private False >>> >> ## The subnet broadcast address >>> mask.broadcast IPv4Address('192.192.45.127') >>> mask.iterhosts()  

Puede calcular el valor de 32 bits de la máscara de esta manera

 (1<<32) - (1<<32>>mask_length) 

p.ej.

 >>> import socket, struct >>> mask_length = 24 >>> mask = (1<<32) - (1<<32>>mask_length) >>> socket.inet_ntoa(struct.pack(">L", mask)) '255.255.255.0'