How can I convert a CIDR prefix to a dotted-quad netmask in Python?
For example, if the prefix is 12
I need to return 255.240.0.0
.
Here is a solution on the lighter side (no module dependencies):
netmask = '.'.join([str((0xffffffff << (32 - len) >> i) & 0xff)
for i in [24, 16, 8, 0]])
You can do it like this:
def cidr(prefix):
return socket.inet_ntoa(struct.pack(">I", (0xffffffff << (32 - prefix)) & 0xffffffff))
And this is a more efficient one:
netmask = 0xFFFFFFFF & (2**(32-len)-1)
or, if you have difficulties counting the number of F:
netmask = (2**32-1) & ~ (2 ** (32-len)-1)
and now a possibly even more efficient (albeit more difficult to read):
netmask = (1<<32)-1 & ~ ((1 << (32-len))-1)
To get the dotted.quad version of the mask, you can use inet.ntoa to convert the above netmask.
Note: for uniformity with other message, I used 'len' as the mask length, even if I do not like to use a function name as variable name.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With