我正在构建一个嵌入式网络设备(基于Linux),并且已经遇到了动态构建守护进程conf文件的需求。因此,我需要能够在构建conf文件的python代码中进行一些网络地址计算。我不是程序员,所以我很害怕我写了一个模块,一旦设备开始出货,我将无法正常工作。
以下是我到目前为止的内容,它与我在本网站和Google上找到的内容完全吻合。
有没有更好的方法来查找网络接口的网络地址和cidr?将网络掩码转换为bin str并对1进行计数似乎非常不优雅。
import socket
import fcntl
import struct
SIOCGIFNETMASK = 0x891b
SIOCGIFADDR = 0x8915
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def _GetIfaceMask(iface):
return struct.unpack('L', fcntl.ioctl(s, SIOCGIFNETMASK, struct.pack('256s', iface))[20:24])[0]
def _GetIfaceAddr(iface):
return struct.unpack('L', fcntl.ioctl(s, SIOCGIFADDR, struct.pack('256s', iface[:15]))[20:24])[0]
def GetIfaceNet(iface):
net_addr = _GetIfaceAddr(iface) & _GetIfaceMask(iface)
return socket.inet_ntoa(struct.pack('L', net_addr))
def GetIfaceCidr(iface):
bin_str = bin(_GetIfaceMask(iface))[2:]
cidr = 0
for c in bin_str:
if c == '1': cidr += 1
return cidr
感谢您的任何意见,我真的对此感到有些失望。如果这不是此类反馈的地方,请告诉我。
答案 0 :(得分:4)
这可以使用汉明加权算法来解决。从How to count the number of set bits in a 32-bit integer?被盗并翻译成Python:
def number_of_set_bits(x):
x -= (x >> 1) & 0x55555555
x = ((x >> 2) & 0x33333333) + (x & 0x33333333)
x = ((x >> 4) + x) & 0x0f0f0f0f
x += x >> 8
x += x >> 16
return x & 0x0000003f
另一个更易读的解决方案(但在O(log x)
中运行):
def number_of_set_bits(x):
n = 0
while x:
n += x & 1
x = x >> 1
return n
答案 1 :(得分:2)
你可以检查iptools python模块http://code.google.com/p/python-iptools/它可以从长格式转换为虚线ip格式,反之亦然。