Python 2.7:十六进制网络掩码到点分十进制



aix 上 ifconfig 命令的输出给出了十六进制的网络掩码。

>>> import subprocess
>>> import os
>>> import re
>>> import socket
>>> ifconfig_output = subprocess.check_output(['/usr/sbin/ifconfig', '-a']).decode()
>>> result = re.findall(r'[s]+inet ([d.]+) netmask ([w.]+) broadcast ([d.]+)', ifconfig_output, re.S | re.M)
>>> print(result)
[(u'172.17.14.50', u'0xfffff800', u'172.17.15.255'), (u'172.16.156.50', u'0xffffc000', u'172.16.191.255'), (u'172.16.12.10', u'0xfffffe00', u'172.16.13.255'), (u'127.0.0.1', u'0xff000000', u'127.255.255.255')]

我试过这个,但这不允许我使用 0x 前缀。

>>> s = '0xffffc000'
>>> print '.'.join(str(int(i, 16)) for i in ([s[i:i+2] for i in range(0, len(s), 2)]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
ValueError: invalid literal for int() with base 16: '0x'
>>> s = 'ffffc000'
>>> print '.'.join(str(int(i, 16)) for i in ([s[i:i+2] for i in range(0, len(s), 2)]))
255.255.192.0
>>>

那么如何使用标准 lib(无模块(将网络掩码转换为点分十进制表示法呢? 请记住,这是Python 2.7。

一种方法是位移和掩码:

s = int('0xffffc000', 16)
mask = 0x000000ff
print(".".join(map(str, [mask & (s >> 24), mask & (s >> 16), mask & (s >> 8), mask & s])))

输出:

255.255.192.0

编辑:使用您的方法,只需从range()中的2开始,而不是0

range(2, len(s), 2)

最新更新