簡體   English   中英

Python網絡/ cidr計算

[英]Python Network/cidr Calculations

我正在構建一個嵌入式網絡設備(基於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

感謝您的任何意見,我真的有點失意。 如果這不是此類反饋的地方,請告訴我。

這可以使用漢明加權算法來解決。 如何計算32位整數中的設置位數? 並翻譯成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

您可以檢查iptools python模塊http://code.google.com/p/python-iptools/它可以從長格式轉換為虛線ip格式,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM